Ios 如何在swift中修复横向模式中的约束?

Ios 如何在swift中修复横向模式中的约束?,ios,swift,uiview,autolayout,constraints,Ios,Swift,Uiview,Autolayout,Constraints,我有一个问题,关于如何在具有视图的横向模式中解决约束问题 我为在视图控制器底部创建的视图设置约束高度=80 但是,当设备进入横向模式时,我需要将此视图的高度约束设置为40,但在这种情况下,我对约束有一个问题(可能下面列表中至少有一个约束是您不想要的)。 试试这个: (1) 看看每一个约束,试着找出你不期望的; (2) 找到添加了不需要的约束的代码,然后修复它。 ( 您同时启用了两个高度约束,并且它们相互冲突,因此出现了问题。当您激活横向约束时,需要将纵向约束设置为非活动状态,反之亦然 解决方案可

我有一个问题,关于如何在具有视图的横向模式中解决约束问题

我为在视图控制器底部创建的视图设置约束高度=80 但是,当设备进入横向模式时,我需要将此视图的高度约束设置为40,但在这种情况下,我对约束有一个问题(可能下面列表中至少有一个约束是您不想要的)。 试试这个: (1) 看看每一个约束,试着找出你不期望的; (2) 找到添加了不需要的约束的代码,然后修复它。 (


您同时启用了两个高度约束,并且它们相互冲突,因此出现了问题。当您激活横向约束时,需要将纵向约束设置为非活动状态,反之亦然

解决方案可能是在视图生命周期方法(
viewdiload
viewwillbeen
)中一次性设置所有约束,将它们存储在类或结构中的属性或实例变量中,然后在方向更改时打开或关闭它们


或者,如果您确定
工具栏视图
除了在本代码中更改的约束之外没有其他约束,请在调用您的设置方法之前从视图中删除所有约束(不太优雅,可能性能也不太好)。

因为我在社区中总是迟到,所以发布答案很晚。 我是这样处理你的案子的,你可以试试

起初,我的视图控制器就是这样

对于iphone 7plus,纵向高度限制为128,横向高度限制为55

我所做的

第1步:

拉动高度约束出口,以便我可以通过编程方式对其进行更改

第二步:

我为计算定义了一些预定义的值

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
第三步:

生成一个函数,并从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
    })

}
希望你会觉得这很有用

func  updateConstraint() {
    self.redViewHeight.constant = 128 * HEIGHT_RATIO
}
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
    })

}