NSLayoutConstraint - 无法将子视图框架设置为父视图边界

Posted

技术标签:

【中文标题】NSLayoutConstraint - 无法将子视图框架设置为父视图边界【英文标题】:NSLayoutConstraint - can't set subview frame to parent view bounds 【发布时间】:2017-02-01 15:48:10 【问题描述】:

我有一个 testView UIView 和名为 testViewSub 的子视图。 testView 受NSLayoutConstraint 的约束。我将 subView 框架设置为testView.bounds。但它不起作用。这是代码

let testView = UIView()
    testView.backgroundColor = UIColor.red

    self.view.addSubview(testView)

    testView.translatesAutoresizingMaskIntoConstraints = false


    NSLayoutConstraint(item: testView, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1.0, constant: 30).isActive = true

    NSLayoutConstraint(item: testView, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1.0, constant: -30).isActive = true

    NSLayoutConstraint(item: testView, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1.0, constant: 200).isActive = true

    NSLayoutConstraint(item: testView, attribute: .height, relatedBy: .equal, toItem: self.view, attribute: .height, multiplier: 0.15, constant: 0).isActive = true




    let testViewSub = UIView()
    testViewSub.backgroundColor = UIColor.green
    testViewSub.frame = testView.bounds
    self.testView.addSubview(testViewSub)

    testViewSub.translatesAutoresizingMaskIntoConstraints = false

但如果我使用CGRect 设置 testView 的框架。有用。

【问题讨论】:

【参考方案1】:

布局发生在哪里?在视图出现之前,我遇到了约束不生效的问题,因此在 viewDidLoadviewWillAppear 中依赖帧是正确的大小会导致问题。

在这种情况下,在 viewDidAppear 中添加 testViewSub 对我有用,但我不确定这是我推荐的方式。使用约束进行布局,就像使用 testView 一样,也适用于 viewDidLoadviewWillAppear

    // layout constraints however you want - in this case they are such that green view's frame = red view's bounds

    let testViewSub = UIView()
    testViewSub.backgroundColor = UIColor.green
    self.testView.addSubview(testViewSub)

    NSLayoutConstraint(item: testViewSub, attribute: .leading, relatedBy: .equal, toItem: testView, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true

    NSLayoutConstraint(item: testViewSub, attribute: .trailing, relatedBy: .equal, toItem: testView, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true

    NSLayoutConstraint(item: testViewSub, attribute: .top, relatedBy: .equal, toItem: testView, attribute: .top, multiplier: 1.0, constant: 0).isActive = true

    NSLayoutConstraint(item: testViewSub, attribute: .height, relatedBy: .equal, toItem: testView, attribute: .height, multiplier: 1.0, constant: 0).isActive = true


    testViewSub.translatesAutoresizingMaskIntoConstraints = false

这也将比简单地设置框架更好地处理旋转。

【讨论】:

以上是关于NSLayoutConstraint - 无法将子视图框架设置为父视图边界的主要内容,如果未能解决你的问题,请参考以下文章

无法将“NSLayoutConstraint”类型的不可变值作为 inout 参数传递

在 NSLayoutConstraint 上更新“常量”失败,并显示“无法分配给 'constraint' 中的 'constant'”

NSInvalidUnarchiveOperationException:无法实例化名为 NSLayoutConstraint 的类

错误:NSInvalidUnarchiveOperationException:无法实例化名为 NSLayoutConstraint 的类

NSLayoutConstraint 设置

如何在 UIView 中有一个 UIImageView 并应用 NSLayoutConstraint?