我有一个问题,如何通过视图解决横向模式中的约束问题?
我为视图控制器底部创建的视图设置约束高度= 80 但是当设备进入横向模式时,我需要将此视图的高度约束设置为40,但是在这种情况下我遇到问题的约束问题(可能至少下列列表中的一个约束是一个你不想要。 试试这个: (1)看看每个约束,并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (
"<NSLayoutConstraint:0x7d175100 UIView:0x7d5eeef0.height == 40 (active)>",
"<NSLayoutConstraint:0x7d5f8ef0 UIView:0x7d5eeef0.height == 80 (active)>"
)
)
以下是我的代码:
var toolBarView:UIView = {
let view = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 80))
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = UIColor(red: 23 / 255.0, green: 120 / 255.0, blue: 104 / 255.0, alpha: 1.0)
return view
}()
func setupToolBarViewInPortrait() {
toolBarView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
toolBarView.rightAnchor.constraint(equalTo:view.rightAnchor).isActive = true
toolBarView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
toolBarView.heightAnchor.constraint(equalToConstant: 80).isActive = true
}
func setupToolBarViewInLandScape() {
toolBarView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
toolBarView.rightAnchor.constraint(equalTo:view.rightAnchor).isActive = true
toolBarView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
toolBarView.heightAnchor.constraint(equalToConstant: 40).isActive = true
}
override func viewWillLayoutSubviews() {
let oriantation = UIDevice.current.orientation
if oriantation.isLandscape {
setupNavigationBarWithObjectsInLandScape()
setupToolBarViewInLandScape()
}else if oriantation.isPortrait {
setupToolBarViewInPortrait()
}
}
答案 0 :(得分:1)
您同时打开了两个高度限制,并且它们发生冲突,因此存在问题。当您使横向约束处于活动状态时,您需要使纵向约束处于非活动状态,反之亦然。
解决方案可能是在视图生命周期方法(viewDidLoad
或viewWillAppear
)中立即设置所有约束,将它们存储在类或结构中的属性或实例变量中,然后只是当方向改变时打开或关闭它们。
或者,如果您确定toolBarView
没有除此代码中更改的约束之外的其他约束,请在调用您的安装方法之前从视图中删除所有约束(不太优雅,可能不是高性能)。
答案 1 :(得分:1)
因为我在社区总是迟到所以发布答案很晚。 我这样处理你的案子。你可以试试。
起初我的View控制器就像这样。
对于iphone 7plus,纵向和高景观的高度约束是128,我想要高度约束55.
我做了什么。
第1步:
拉高度约束出口,以便我可以通过编程方式更改它。
第2步:
我为计算定义了一些预定义值。
var SCREEN_HEIGHT = UIScreen.main.bounds.size.height
var BASE_SCREEN_HEIGHT:CGFloat = 736.0 //My base layout is iphone 7 plus and 128(redViewheight) according to this.
var HEIGHT_RATIO = SCREEN_HEIGHT/BASE_SCREEN_HEIGHT
第3步:
创建了一个函数,并从viewDidLoad调用它以获取初始布局常量。
func updateConstraint() {
self.redViewHeight.constant = 128 * HEIGHT_RATIO
}
第4步:
当旋转改变时调用此方法,所以我调用了这个函数。
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { context in
//This function will do the trick
let orientation = UIDevice.current.orientation
if orientation == .portrait {
self.redViewHeight.constant = 128 * HEIGHT_RATIO //Just a value
}
else {
self.redViewHeight.constant = 55 * HEIGHT_RATIO //Just a value
}
self.view.layoutIfNeeded()
}, completion: {
_ in
})
}
希望你会发现这很有用。