根据设备方向快速更改约束

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

以上是关于根据设备方向快速更改约束的主要内容,如果未能解决你的问题,请参考以下文章

如何根据设备方向更改堆栈视图方向?

根据设备方向更改图像

iPad - 根据设备方向(纵向或横向)更改图像

滚动视图内的iOS webView:根据设备方向更改高度

设备方向更改时如何重新排列集合视图单元格

更改设备方向上的图像 jquery-mobile