我有一个包含大量文字的标签。有一个用于折叠和扩展标签高度的切换(此处名为“lire la suite”),因此它会截断文本的末尾。
我精心设置了垂直内容拥抱优先级和抗压缩性,因此内在尺寸优先于压缩阻力。
高度约束(直接位于标签右侧的可选约束)设置为常量71
,只有4行的高度。它永远不会改变。
然后,这个相同的约束优先在747
和749
之间切换,所以会发生以下情况:
身高约束优先级= 749
:
抗压性<约束优先级<拥抱优先级
压缩阻力在约束优先级下崩溃,如果其内在大小(拥抱优先级)较小,则其高度为
71
或更小。
身高约束优先级= 747
:
约束优先级<抗压性<拥抱优先级
更大的抗压力迫使高度遵循其固有尺寸。
这完美无缺。我的问题是我无法弄清楚如何设置此约束的动画,因为每个解决方案都会为constant
属性设置动画而不是priority
。
我想知道是否有解决方案或解决方法。
答案 0 :(得分:1)
通过试验,您似乎无法使用优先级为约束设置动画,并且您可能会遇到激活/停用约束或更改其常量的问题。
我几天前做过类似的工作。一个简单但有点天真的方法是放弃约束并仅使用内在内容大小 - 您可以设置label.numberOfLines = 4
何时应该折叠(因此大小不会超过4行),{{1扩展时。这非常容易和干净,但是,我不确定动画会如何。
第二种方法是仅使用约束并为常量设置动画。您已经有4行的高度,您只需要扩展标签的高度。您可以在label.numberOfLines = 0
上使用以下扩展名来计算高度:
UILabel
然后你需要动画的是:
extension UILabel {
func heightNeeded() -> CGFloat {
self.layoutIfNeeded()
let myText = self.text! as NSString
let boundingRectangle = CGSize(width: self.bounds.width, height: CGFloat.greatestFiniteMagnitude)
let labelSize = myText.boundingRect(with: boundingRectangle,
options: .usesLineFragmentOrigin,
attributes: [NSAttributedStringKey.font: self.font],
context: nil)
return labelSize.height
}
}
不要忘记如何使用autolayout为常量设置动画,例如参见我的following answer到另一个SO问题。