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

时间:2017-04-27 19:51:15

标签: ios swift uiview autolayout constraints

我有一个问题,如何通过视图解决横向模式中的约束问题?

我为视图控制器底部创建的视图设置约束高度= 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()
        }

    }

2 个答案:

答案 0 :(得分:1)

您同时打开了两个高度限制,并且它们发生冲突,因此存在问题。当您使横向约束处于活动状态时,您需要使纵向约束处于非活动状态,反之亦然。

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

或者,如果您确定toolBarView没有除此代码中更改的约束之外的其他约束,请在调用您的安装方法之前从视图中删除所有约束(不太优雅,可能不是高性能)。

答案 1 :(得分:1)

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

起初我的View控制器就像这样。

enter image description here

对于iphone 7plus,纵向和高景观的高度约束是128,我想要高度约束55.

我做了什么。

第1步:

拉高度约束出口,以便我可以通过编程方式更改它。

enter image description here

第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
    })

}

希望你会发现这很有用。