更新方向改变的约束条件

时间:2018-07-24 17:48:57

标签: swift autolayout orientation adaptive-layout

下面是我要显示为人像模式(图像1)和风景的视图(图像2)。我面临着无法在横向正确显示的问题。

图片1: enter image description here

我在情节提要中有设置约束。

greenView: top: 0, leading: 0, trailing: 0, width: equal to superview.width, height: equal to superview.height/2

图片2:enter image description here 我尝试修改约束,但是当我将设备转到横向时,greenView变为屏幕的1/4。下面是代码。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape {
        greenView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.50).isActive = true
        greenView.heightAnchor.constraint(equalToConstant: 0).isActive = true
    } else {
    }
}

2 个答案:

答案 0 :(得分:0)

不必为此麻烦创建约束,而是将两个视图都插入UIStackView(垂直)中,并且如果方向为viewWillTransition,则在isLandscape内将轴更改为水平

加上这些约束

greenView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.50).isActive = true
greenView.heightAnchor.constraint(equalToConstant: 0).isActive = true

由于未删除旧版本会造成冲突

//

func shared () {

     if UIDevice.current.orientation == .portrait {

         self.stView.axis = .vertical
     }
     else {

         self.stView.axis = .horizontal 
     }

 }

viewDidLoadviewWillTransition中调用上述方法

答案 1 :(得分:0)

isActive标志是极易被误解的选项。此标志不会更改约束的状态,它会完全添加或删除约束。

greenView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.50).isActive = true
greenView.heightAnchor.constraint(equalToConstant: 0).isActive = true

上面的代码将在您的视图上添加多个约束。每次旋转设备新的宽度时,都会将高度限制添加到视图中,这将导致视图具有多个高度和宽度限制。要添加/删除相同的约束,请存储其引用,然后在其上使用isActive

我不确定为什么将高度限制设置为0?

现在进入您想做的事情。我可以想到两种方法

第一种方法

除了情节提要中的现有约束外,还添加了两个约束,但将其优先级保持在低(<1000):

1. greenView.bottom = safeArea.bottom
2. greenView.width = superView.width/2

制作greenView.height = superview.height/2 and greenView.trailing = superView.trailing的IBOutlet。 出口应该是那些具有较高优先级的约束请确保您的插座没有弱电,否则当您设置isActive false时,插座将变为零。现在,您要做的就是在设备更改为横向模式时进行以下设置:

highPriorityGreenViewConstraint.isActive = false
highPriorityHeightConstraint.isActive = false

第二种方法

使用尺寸类别设置约束。提到了所有尺寸类别here

示例-仅针对greenView.bottom = safeArea.bottom个大小类安装greenView.width = superView.width/2compact width compact height约束。您将不得不在此方法中施加更多约束,因为即使iPhone型号之间的景观尺寸等级也有所不同。