为什么在 Swift 中使用惰性变量初始化时添加帧不显示 UIView?



我正在做一个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的框架中设置了宽度和高度,我认为我不需要在setupConstraints中设置宽度和高度约束,但它不会显示视图,除非我再次添加宽度和高度约束。所以在这种情况下,为什么我不能在UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))中设置宽度和高度,我还必须再次添加宽度/高度约束?

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)
])

设置定位&根据自动布局的期望动态大小。


translatesAutoresizingMaskIntoConstraints

一个布尔值,决定视图是否自动调整大小自动布局约束

<一口>裁判:https://developer.apple.com/documentation/uikit/uiview/1622572-translatesautoresizingmaskintoco

相关内容

最新更新