与此同时,我找到了一个很好的解决方案。由于这个问题得到了如此多的支持,我想我应该快速描述一下。我受到 WWDC 会议的启发而想到了这个解决方案。
我已经转向 Swift,所以请原谅,代码将是 swift - 但概念对于 Obj-C 是相同的。
首先声明三个约束数组:
// Constraints
private var compactConstraints: [NSLayoutConstraint] = []
private var regularConstraints: [NSLayoutConstraint] = []
private var sharedConstraints: [NSLayoutConstraint] = []
然后你相应地填充约束。您可以在您调用的单独函数中执行此操作viewDidLoad
或者你这样做viewDidLoad
直接地。
sharedConstraints.append(contentsOf: [
btnStackView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
...
])
compactConstraints.append(contentsOf: [
btnStackView.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.7),
...
])
regularConstraints.append(contentsOf: [
btnStackView.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.4),
...
])
重要的部分是在尺寸类别之间切换并激活/停用适当的约束。
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if (!sharedConstraints[0].isActive) {
// activating shared constraints
NSLayoutConstraint.activate(sharedConstraints)
}
if traitCollection.horizontalSizeClass == .compact && traitCollection.verticalSizeClass == .regular {
if regularConstraints.count > 0 && regularConstraints[0].isActive {
NSLayoutConstraint.deactivate(regularConstraints)
}
// activating compact constraints
NSLayoutConstraint.activate(compactConstraints)
} else {
if compactConstraints.count > 0 && compactConstraints[0].isActive {
NSLayoutConstraint.deactivate(compactConstraints)
}
// activating regular constraints
NSLayoutConstraint.activate(regularConstraints)
}
}
我知道这些限制不适合问题中的限制。但约束本身是无关紧要的。最主要的是如何根据尺寸类别在两组约束之间进行切换。
希望这可以帮助。