下面是我要显示为人像模式(图像1)和风景的视图(图像2)。我面临着无法在横向正确显示的问题。
我在情节提要中有设置约束。
greenView: top: 0, leading: 0, trailing: 0, width: equal to superview.width, height: equal to superview.height/2
图片2: 我尝试修改约束,但是当我将设备转到横向时,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 {
}
}
答案 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
}
}
在viewDidLoad
和viewWillTransition
中调用上述方法
答案 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/2
,compact width compact height
约束。您将不得不在此方法中施加更多约束,因为即使iPhone型号之间的景观尺寸等级也有所不同。