iOS 均匀观看太空

示例

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