空间视野均匀

StackOverflow 文档

通常希望两个视图并排,以超级视图为中心。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)。因此,如果要使用它们,则必须在代码中创建约束。来源