答案 0 :(得分:2)
假设您已经处理了方向并且您正确地接收了事件,我发现如果您创建双重约束并操纵它们的优先级,则效果最佳。
在故事板中,将按钮放在其中一个位置上,并添加所需的所有约束。将所有优先级设置为900(稍后将解释为什么不是1000)并确认布局正常。
现在将这些约束优先级设置为100并开始为其他布局添加约束。将这些约束优先级设置为900,并确认布局也适用于此场景。
此时,您需要将一组的优先级更改为900,将其他组的优先级更改为100以交换模式。所以现在进入编码...
您将需要这些约束的出口,拖动所有这些约束,命名并添加然后更改每个约束的优先级将是痛苦的。但幸运的是,您可以使用数组,因此在代码中添加以下内容:
@IBOutlet var portraitConstraints: [NSLayoutConstraint]?
@IBOutlet var landscapeConstraints: [NSLayoutConstraint]?
现在只需将所有约束拖动到这两个数组作为出口。
其余的很直接。类似的东西:
func setMode(mode: LayoutMode, animated: Bool) {
switch mode {
case .portrait:
portraitConstraints?.forEach { $0.priority = 900 }
landscapeConstraints?.forEach { $0.priority = 100 }
case .landscape:
portraitConstraints?.forEach { $0.priority = 100 }
landscapeConstraints?.forEach { $0.priority = 900 }
}
UIView.animate(withDuration: animated ? 0.3 : 0.0) {
self.view.layoutIfNeeded()
}
}
关于不将约束优先级设置为1000:
不允许更改优先级设置为1000的约束的优先级。不知道为什么,不关心原因。
编辑:这似乎不清楚所以让我举一个例子来说明你的案例:
假设您有一个视图,其中包含名为inputContainer
的“Mobile”,“1”,“20.00KD”,“ - / +”,名为deleteButton
的删除按钮和左侧的图片视图叫imageView
。
现在,纵向模式可以将约束设置为:
inputContainer.top = superView.top + t
inputContainer.leading = imageView.trailing + a
deleteButton.leading = inputContainer.leading
deleteButton.top = inputContainer.bottom + b
deleteButton.bottom = superView.bottom - t
然后在风景中你会有:
inputContainer.center.y = superView.center.y
inputContainer.leading = imageView.trailing + a
deleteButton.center.y = switchView.center.y
deleteButton.leading = inputContainer.trailing + b
现在将其中一个设置为900的优先级,其他设置为故事板中的100个。然后将所有这些约束连接到代码中的相应数组中。就是这样。