[英]Programmatically create auto layout constraints with different constants for different size classes
如果使用情節提要,則可以使用Interface Builder將自動布局約束添加到視圖中,並且可以非常輕松地為所需的每個大小類添加不同的constant
量值。 當您運行應用程序並在尺寸類別之間切換時,UI將自動更新並重新定位,以遵守新尺寸類別的正確constant
數值。
我的問題是,如何通過編程方式獲得相同的行為?
創建NSLayoutConstraint
,不能為不同的大小類設置不同的值。 因此,我認為這將是一個更加手動的過程。 例如,您必須為viewDidLoad
的當前大小類創建具有正確值的約束,然后必須使用willTransitionToTraitCollection
或updateConstraints
並檢測新的大小類,然后為所有約束更改constant
s適用於新的size類,然后在需要重新定位的視圖上調用layoutIfNeeded
。 那將是很多代碼,對於要優化的更多大小的類,情況將更糟。 是否沒有更容易和/或更有效的方法以編程方式獲得該行為?
請注意,此問題不僅限於自動布局約束,而是可以根據大小類更改其屬性值的任何對象。 例如,為不同大小的類設置UILabel
的字體。
您需要創建不同的NSLayoutConstraint
集。
根據下面的討論進行編輯。
@Joey :您必須在viewDidLoad
(或類似的視圖 )和viewWillTransitionToSize
處理大小類決策。
大小類檢測應在animateAlongsideTransition
塊內而不是之前進行。
重構代碼:
override func viewDidLoad() {
super.viewDidLoad()
let narrow = self.view.traitCollection.horizontalSizeClass
== UIUserInterfaceSizeClass.Compact
self.useNarrowConstraints(narrow)
}
override func viewWillTransitionToSize(size: CGSize,
withTransitionCoordinator
coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
coordinator.animateAlongsideTransition({
(UIViewControllerTransitionCoordinatorContext) -> Void in
let narrow = self.view.traitCollection.horizontalSizeClass
== UIUserInterfaceSizeClass.Compact
self.useNarrowConstraints(narrow)
})
{ (UIViewControllerTransitionCoordinatorContext) -> Void in
}
}
使用激活:
func useNarrowConstraints(narrow: Bool) {
if narrow {
NSLayoutConstraint.deactivateConstraints([self.fullWidthConstraint])
NSLayoutConstraint.activateConstraints([self.halfWidthConstraint])
} else {
NSLayoutConstraint.deactivateConstraints([self.halfWidthConstraint])
NSLayoutConstraint.activateConstraints([self.fullWidthConstraint])
}
}
進一步的細節在這里 。
使用替代:
func useNarrowConstraints(narrow: Bool) {
view.removeConstraint(constraint)
if narrow {
constraint = NSLayoutConstraint.constraintsWithVisualFormat("format", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary)
} else {
constraint = NSLayoutConstraint.constraintsWithVisualFormat("otherFormat", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary)
}
view.addConstraint(constraint)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.