1

下面是纵向模式的视图(图 1)和我想显示的横向视图(图 2)。我面临着在风景中正确显示的问题。

图 1: 在此处输入图像描述

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

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 {
    }
}
4

2 回答 2

0

isActiveflag 是一个被高度误解的选项。此标志不会更改约束的状态,它会完全添加或删除约束。

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

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

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

现在来做你想做的事。我可以想到2种方法

第一种方法

除了故事板中的现有约束之外,再添加两个约束,但保持它们的优先级较低(<1000):

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

制作 IBOutlet 的greenView.height = superview.height/2 and greenView.trailing = superView.trailing网点应该是那些具有高优先级的约束确保您的 Outlets 不弱,否则当您设置时它们的 outlet 将变为 nilisActive false。现在您所要做的就是在设备更改为横向模式时进行设置:

highPriorityGreenViewConstraint.isActive = false
highPriorityHeightConstraint.isActive = false

第二种方法

使用尺寸等级来设置您的约束。这里提到了所有尺寸等级。

示例 - 安装greenView.bottom = safeArea.bottom,仅限大小类的greenView.width = superView.width/2约束。compact width compact height您将不得不在这种方法中施加更多限制,因为即使在 iPhone 型号之间横向尺寸等级也不同。

于 2018-07-27T11:22:55.237 回答
0

而不是为这个问题创建约束而头痛,将两个视图都插入 a UIStackView(vertical) ,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

于 2018-07-24T17:51:28.207 回答