【发布时间】:2020-06-29 11:51:12
【问题描述】:
使用 NSLayoutConstraints 以编程方式与使用 Storyboard 或 Xib 配置约束相比,我得到了不同的(意外)行为。使用完全相同的约束。
我想要完成的是:一个 UILabel 在将其约束到超级视图的中心时调整其内在内容大小,并将前导和尾随约束关系设置为“greaterThanOrEqual”。
1. 故事板按预期工作。它将 UILabel 调整为其内在内容大小:
2. 程序化方法以全角显示UILabel,而不是Unable to simultaneously satisfy constraints.警告:
我创建了一个示例项目来说明问题:https://github.com/thomasneuteboom/temp-layout-constraints-issue。
有人能指出我在这里遗漏的明显东西吗?故事板是否为 UILabel 提供了额外的(隐藏的)行为?
代码:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let programmaticallyLabel = UILabel()
programmaticallyLabel.text = "Programmatically example"
programmaticallyLabel.textColor = .white
programmaticallyLabel.backgroundColor = .blue
self.view.addSubview(programmaticallyLabel)
// programmaticallyLabel.sizeToFit()
// Setup constraints.
programmaticallyLabel.translatesAutoresizingMaskIntoConstraints = false
let leadingConstraint = NSLayoutConstraint(item: programmaticallyLabel, attribute: NSLayoutConstraint.Attribute.leading, relatedBy: NSLayoutConstraint.Relation.greaterThanOrEqual, toItem: self.view.safeAreaLayoutGuide, attribute: NSLayoutConstraint.Attribute.leading, multiplier: 1, constant: 15)
let trailingConstraint = NSLayoutConstraint(item: programmaticallyLabel, attribute: NSLayoutConstraint.Attribute.trailing, relatedBy: NSLayoutConstraint.Relation.greaterThanOrEqual, toItem: self.view.safeAreaLayoutGuide, attribute: NSLayoutConstraint.Attribute.trailing, multiplier: 1, constant: 15)
let horizontalConstraint = NSLayoutConstraint(item: programmaticallyLabel, attribute: NSLayoutConstraint.Attribute.centerX, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self.view.safeAreaLayoutGuide, attribute: NSLayoutConstraint.Attribute.centerX, multiplier: 1, constant: 0)
let verticalConstraint = NSLayoutConstraint(item: programmaticallyLabel, attribute: NSLayoutConstraint.Attribute.centerY, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self.view.safeAreaLayoutGuide, attribute: NSLayoutConstraint.Attribute.centerY, multiplier: 1, constant: 0)
self.view.addConstraints([leadingConstraint, trailingConstraint, horizontalConstraint, verticalConstraint])
}
【问题讨论】:
-
你最好使用 NSLayoutConstraint.activate
-
你真的应该使用布局锚。轻松多了