【问题标题】:Constraints not updating and view is letterboxed when rotating device旋转设备时约束未更新且视图为信箱
【发布时间】:2021-09-27 09:42:29
【问题描述】:

背景:

当旋转设备时,myView 视图变为信箱,而不是调整大小以适应屏幕,见下图。

在情节提要上,设置了centreXcentreY 约束。

在代码中,widthheight 约束是通过函数 viewAddConstraints() 设置的,请参见下面的代码。

设备旋转后,我再次调用viewAddConstraints(),但是Xcode给出以下错误:Unable to simultaneously satisfy constraints.


问题:

如何正确移除旧约束,然后在设备旋转时添加新约束?

如何在设备旋转时正确更新视图的约束?


代码:

func viewAddConstraints() {

// Width constraint full width of screen
        let myViewWidth = NSLayoutConstraint(item: myView as Any, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: view.bounds.width)
        myView.addConstraint(myViewWidth)

// Height constraint full height of screen
        let myViewHeight = NSLayoutConstraint(item: myView as Any, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: view.bounds.height)
        myView.addConstraint(myViewHeight)

}

图片:

当前情况,视图被错误地加了字。

预期情况,正确调整视图大小。

【问题讨论】:

  • 您可以通过保留对现有约束的引用(通常作为实例属性)来移除现有约束,以便您可以停用某些内容。换句话说,不要仅仅创建myViewWidthmyViewHeight 并在激活它们后将它们扔掉,而是存储它们。

标签: ios swift constraints orientation nslayoutconstraint


【解决方案1】:

设置约束以使您的子视图“固定”到两侧的正确方法:

override func viewDidLoad() {
    super.viewDidLoad()
    
    let myView = UIView()
    myView.backgroundColor = .systemTeal
    myView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(myView)
    
    NSLayoutConstraint.activate([
        myView.topAnchor.constraint(equalTo: view.topAnchor),
        myView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        myView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        myView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
    ])
    
}

或者,既然您应该遵守安全区

override func viewDidLoad() {
    super.viewDidLoad()
    
    let myView = UIView()
    myView.backgroundColor = .systemTeal
    myView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(myView)
    
    let g = view.safeAreaLayoutGuide

    NSLayoutConstraint.activate([
        myView.topAnchor.constraint(equalTo: g.topAnchor),
        myView.leadingAnchor.constraint(equalTo: g.leadingAnchor),
        myView.trailingAnchor.constraint(equalTo: g.trailingAnchor),
        myView.bottomAnchor.constraint(equalTo: g.bottomAnchor),
    ])
    
}

现在您的子视图将自动调整大小以适应设备旋转的父视图。

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多