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】:布局发生在哪里?在视图出现之前,我遇到了约束不生效的问题,因此在 viewDidLoad
或 viewWillAppear
中依赖帧是正确的大小会导致问题。
在这种情况下,在 viewDidAppear
中添加 testViewSub
对我有用,但我不确定这是我推荐的方式。使用约束进行布局,就像使用 testView
一样,也适用于 viewDidLoad
或 viewWillAppear
:
// 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 的类