当设备从纵向旋转到横向时, View 的宽度约束会更新,但当设备从横向旋转到纵向时它不会更新
我的代码:
override func viewDidLoad() {
super.viewDidLoad()
theView.translatesAutoresizingMaskIntoConstraints = false
theView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
theView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
theView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
theView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
当设备第一次从纵向旋转到横向时,“theView”宽度获得 View 宽度的 50%
if UIDevice.current.orientation.isLandscape {
theView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.50).isActive = true
从横向旋转到纵向不会恢复原来的宽度
} else {
theView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1.00).isActive = true
}
}
这是一张显示我正在尝试做的事情的图片。
最佳答案
旋转时应该禁用右 anchor 约束。
因为 NSLayoutAnchor
类的 constraint
方法总是返回新的、不活动的约束,你应该保留对你想要激活/停用的约束的引用强>.
初始化可能看起来像这样。
override func viewDidLoad() {
super.viewDidLoad()
// ...
widthConstraint = theView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.50)
rightConstraint = theView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0)
rightConstraint.isActive = true
}
有了这些引用,您就可以像这样实现您的 willRotate:
方法。
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.current.orientation.isLandscape {
rightConstraint.isActive = false
widthConstraint.isActive = true
}
else {
rightConstraint.isActive = true
widthConstraint.isActive = false
}
}
它应该是这样的。
关于ios - 根据设备方向快速更改约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47082655/