【发布时间】:2015-07-15 17:13:49
【问题描述】:
我正在将 UILabel 添加到具有以下布局要求的视图中:
- 标签应该居中
- 标签的最大字体大小应为 100 磅,但应按比例缩小以适应。它不应被截断。
- 标签的高度不应超过 450 磅。
- 另一个视图将直接位于标签下方。
我的标签的属性布局约束似乎充分描述了这一点:
let label = UILabel()
label.backgroundColor = UIColor.yellowColor()
label.font = UIFont.systemFontOfSize(100)
label.numberOfLines = 0
label.textAlignment = .Center
label.adjustsFontSizeToFitWidth = true
label.text = "What's Brewing in PET/CT: CT and MR Emphasis"
label.setTranslatesAutoresizingMaskIntoConstraints(false)
view.addSubview(label)
view.addConstraint(NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 0))
view.addConstraint(NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: 0))
view.addConstraint(NSLayoutConstraint(item: label, attribute: .Left, relatedBy: .Equal, toItem: view, attribute: .Left, multiplier: 1, constant: 60))
view.addConstraint(NSLayoutConstraint(item: label, attribute: .Right, relatedBy: .Equal, toItem: view, attribute: .Right, multiplier: 1, constant: -60))
view.addConstraint(NSLayoutConstraint(item: label, attribute: .Height, relatedBy: .LessThanOrEqual, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 450))
但是,我发现对于像下面这样较长的内容,标签会显示一些意想不到的边距:
这是不可接受的,因为任何直接放置在标签上方或下方的视图都会有间隙。
根据下面的讨论,我的工作原理是布局引擎是根据字体大小 100 计算大小,而不考虑内容较长时的后续缩放。
我怎样才能满足上面列出的布局要求(最好不使用任何已弃用的方法)?
这里有一个test project 可以玩。
【问题讨论】:
-
您似乎将高度设置为 = 0 而不是
-
是的,这是必需的(我将更新我的问题以提及它) - 我不希望标签的长度超过 450,但它可以而且应该尽可能短。我的理解是拥抱优先是为了解决这个问题。
-
当你设置文本/字体时,你可以尝试调用
[label sizeToFit];。不是快人。我猜应该是label.sizeToFit()。 -
谢谢,但我已经尝试过了(以及 setNeedsUpdateConstraints 和 setNeedsLayout)
-
当您使用 .XXXXThanOrEqual 约束时,使用具有 .Equal 和较低优先级的另一个约束通常会有所帮助,因此您可以告诉布局管理器在哪个方向进行缩放。因此,在您的情况下,请尝试将高度等于 0 并将优先级设置为低
标签: ios autolayout uilabel nslayoutconstraint