为什么在 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
我正在做一个 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