为什么在 Swift 中使用 lazy var 初始化时添加框架不显示 UIView

Why adding frame doesn't show a UIView when initializing with lazy var in Swift

我正在做一个 Swift 项目,有一件事我不清楚关于以编程方式制作 UI。 我试图在屏幕上显示一个简单的 UIView。

lazy var container: UIView = {
    let view = UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
    view.backgroundColor = UIColor.systemImageGray()
    view.layer.cornerRadius = view.layer.bounds.width / 2
    view.clipsToBounds = true
    return view
}()

override func viewDidLoad() {
    super.viewDidLoad()
    view.addSubview(container)
    setupConstraints()
}

func setupConstraints() {
    container.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        container.topAnchor.constraint(equalTo: self.topAnchor, constant: 14),
        container.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -14),
        container.widthAnchor.constraint(equalToConstant: 30),
        container.heightAnchor.constraint(equalToConstant: 30)
    ])
}

上面的代码工作正常,但是因为我设置了两次with和height,所以我觉得它是多余的,比如UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))并且在setupConstraints中设置了宽度和高度约束。

由于我在UIView的frame中设置了宽高,我以为我不需要在setupConstraints中设置宽高约束,但它不显示视图,除非我添加宽高约束再次。所以在这种情况下,为什么我不能在 UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 30)) 中设置宽度和高度,我还必须添加 width/height 约束又是?

frame 在您不使用自动布局引擎放置视图时很有用。

当你这样做时:

container.translatesAutoresizingMaskIntoConstraints = false

您明确告诉引擎忽略框架并且您负责应用一组新的约束。

因此你最终做到了:

NSLayoutConstraint.activate([
    container.topAnchor.constraint(equalTo: self.topAnchor, constant: 14),
    container.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -14),
    container.widthAnchor.constraint(equalToConstant: 30),
    container.heightAnchor.constraint(equalToConstant: 30)
])

根据 Autolayout 的预期设置定位和动态大小。


translatesAutoresizingMaskIntoConstraints

A Boolean value that determines whether the view’s autoresizing mask is translated into Auto Layout constraints.

Ref: https://developer.apple.com/documentation/uikit/uiview/1622572-translatesautoresizingmaskintoco