以编程方式创建的 UIView 约束,未应用锚点

Posted

技术标签:

【中文标题】以编程方式创建的 UIView 约束,未应用锚点【英文标题】:Programmatically created UIView constraints with anchors not being applied 【发布时间】:2016-09-21 16:09:50 【问题描述】:

我在 Playground 中使用 Xcode 8 和 Swift 3 创建了以下代码。根据我所读到的内容,这似乎应该显示一个子视图,大小为 30 x 30 点,位于包含 UIView。我也尝试了各种其他类型的约束,但无济于事。内部 UIView 只是不显示。

这应该是自定义 UIView 子类的一部分,使用 @IBDesignable 和 @IBInspectable。如果我手动设置子视图的框架,它们就可以正常工作,但我希望可以选择在需要时自动调整大小。我在这里看到了一些其他使用 Visual Formatting Language 的示例,尽管我对它们也没有任何运气,我想我更喜欢使用锚点。关于为什么这不起作用的任何线索?

import UIKit

// Define a simple UIView to put a subview in
let outer = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 480))

// Add a little style to verify that properties are updating
outer.layer.borderWidth = 2.0
outer.layer.borderColor = UIColor.green.cgColor

// Create a subview
let inner = UIView(frame: CGRect.zero)

// I believe this is needed to set constraints manually
inner.translatesAutoresizingMaskIntoConstraints = false

// Add the subview. This displays outer, and it's just a box with a border
outer.addSubview(inner)

// Add a color so I can see it
inner.backgroundColor = UIColor.black

// These constraints should be enough to define the position and size
inner.heightAnchor.constraint(equalToConstant: 30.0).isActive = true
inner.widthAnchor.constraint(equalToConstant: 30.0).isActive = true
inner.centerYAnchor.constraint(equalTo: outer.centerYAnchor).isActive = true
inner.centerXAnchor.constraint(equalTo: outer.centerXAnchor).isActive = true

outer.setNeedsDisplay() // This doesn't seem to do anything, but I tried it
inner.setNeedsDisplay() // Same here

inner.frame // Shows as x 0 y 0 w 0 h 0

// Show the UIView, which looks exactly the same as before.
outer

【问题讨论】:

【参考方案1】:

将两个 setNeedsDisplay() 调用替换为

outer.layoutIfNeeded()

【讨论】:

完美。非常感谢!

以上是关于以编程方式创建的 UIView 约束,未应用锚点的主要内容,如果未能解决你的问题,请参考以下文章

对子类 UIView 的约束会抛出以编程方式创建的 UILabel 位置

约束或其锚点是不是引用不同视图层次结构中的项目?这是违法的

使用自动布局约束以编程方式创建四个具有相同高度和宽度的 UIView

UISlider 约束以编程方式:“约束项必须每个都是 UIView 或子类的实例”

在 UIView 中以编程方式创建的 UILabel 未更新

以编程方式约束 Dynamic ViewController 中的自定义 UIView