根据设备方向快速更改约束
Posted
技术标签:
【中文标题】根据设备方向快速更改约束【英文标题】:Swift changing constraints depending on device orientation 【发布时间】:2017-11-02 18:54:15 【问题描述】:当设备从纵向旋转到横向时,视图的宽度约束会更新,但是当设备从横向旋转到纵向时它不会更新
我的代码:
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' 宽度获得 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
这是一张显示我正在尝试做的图片。
【问题讨论】:
【参考方案1】:您应该在旋转时禁用右锚约束。
因为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
它应该看起来像这样。
【讨论】:
Kamil,在横向它可以工作,但旋转到纵向不会将宽度恢复到 100% 完美运行。谢谢@Kamil以上是关于根据设备方向快速更改约束的主要内容,如果未能解决你的问题,请参考以下文章