空間視野均勻

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)。因此,如果要使用它們,則必須在程式碼中建立約束。來源