空间视野均匀
通常希望两个视图并排,以超级视图为中心。Stack Overflow 上给出的常见答案是将这两个视图嵌入 UIView
并将 UIView
置于中心。这不是必需的或推荐的。来自 UILayoutGuide 文档:
将虚拟视图添加到视图层次结构中会产生许多成本。首先,创建和维护视图本身是成本。其次,虚拟视图是视图层次结构的完整成员,这意味着它会增加层次结构执行的每个任务的开销。最糟糕的是,隐形虚拟视图可以拦截用于其他视图的消息,从而导致很难找到的问题。
你可以使用 UILayoutGuide
执行此操作,而不是将按钮添加到不必要的 UIView
中。UILayoutGuide
本质上是一个可以与自动布局交互的矩形空间。你在按钮的左侧和右侧放置了一个 UILayoutGuide
,并将它们的宽度设置为相等。这将使按钮居中。以下是如何在代码中执行此操作:
视觉格式语言风格
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
]
// Lay the buttons and layout guides out horizontally in a line.
// Put the layout guides on each end.
NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[leftSpace][button1]-[button2][rightSpace]|", options: [], metrics: nil, views: views))
// Now set the layout guides widths equal, so that the space on the
// left and the right of the buttons will be equal
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)。因此,如果要使用它们,则必须在代码中创建约束。来源 。