通常希望两个视图并排放置,并以其超级视图为中心。在Stack Overflow上给出的常见答案是将这两个视图嵌入aUIView并将其居中UIView。不必要或不建议这样做。从UILayoutGuide文档:
将虚拟视图添加到视图层次结构需要付出很多成本。首先,存在创建和维护视图本身的成本。其次,虚拟视图是视图层次结构的完整成员,这意味着它为层次结构执行的每个任务增加了开销。最糟糕的是,不可见的虚拟视图可能拦截旨在发送给其他视图的消息,从而导致很难发现的问题。
您可以UILayoutGuide用来执行此操作,而不必将按钮添加到不必要的中UIView。AUILayoutGuide本质上是一个矩形空间,可以与“自动布局”交互。您UILayoutGuide在按钮的左侧和右侧放置a并将其宽度设置为相等。这将使按钮居中。这是在代码中的方法:
视觉格式语言样式
view.addSubview(button1) view.addSubview(button2) let leftSpace = UILayoutGuide() view.addLayoutGuide(leftSpace) let rightSpace = UILayoutGuide() view.addLayoutGuide(rightSpace) let views = [ "leftSpace" : leftSpace, "button1" : button1, "button2" : button2, "rightSpace" : rightSpace ] // 将按钮和布局指南水平放置在一行中。 // 在每一端放置布局指南。 NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[leftSpace][button1]-[button2][rightSpace]|", options: [], metrics: nil, views: views)) // 现在,将布局参考线的宽度设置为相等,以便 // 按钮的左右将相等 leftSpace.widthAnchor.constraintEqualToAnchor(rightSpace.widthAnchor).active = true
锚样式
let leadingSpace = UILayoutGuide() let trailingSpace = UILayoutGuide() view.addLayoutGuide(leadingSpace) view.addLayoutGuide(trailingSpace) leadingSpace.widthAnchor.constraintEqualToAnchor(trailingSpace.widthAnchor).active = true leadingSpace.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor).active = true leadingSpace.trailingAnchor.constraintEqualToAnchor(button1.leadingAnchor).active = true trailingSpace.leadingAnchor.constraintEqualToAnchor(button2.trailingAnchor).active = true trailingSpace.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor).active = true
您还需要为此添加垂直约束,但这将使按钮在视图中居中,而无需添加任何“虚拟”视图!这样可以避免系统在显示那些“虚拟”视图时浪费CPU时间。本示例使用按钮,但是您可以将按钮交换出任何要添加约束的视图。
如果您支持iOS 8或更早版本,则创建此布局的最简单方法是添加隐藏的虚拟视图。在iOS 9中,您可以使用布局指南替换虚拟视图。
注意:Interface Builder还不支持布局指南(Xcode 7.2.1)。因此,如果要使用它们,则必须在代码中创建约束。资源。