通过更改其优先级值来设置布局约束的动画
我有一个包含大量文字的标签。 有一个用于折叠和扩展标签高度的切换(这里命名为“lire la suite” ),因此它会截断文本的结尾。
我精心设置了垂直内容拥抱优先级和抗压缩性,因此内在尺寸优先于压缩阻力。
高度约束(直接在标签右侧的可选约束)设置为常量71
,仅为4行的高度。 它永远不会改变。
然后,这个相同的约束优先级在747
和749
之间切换,因此会发生以下情况:
-
高度约束优先级=
749
:压缩阻力<约束优先级<拥抱优先级
压缩阻力在约束优先级下崩溃,如果其固有尺寸(拥抱优先级)较小,则其高度为
71
或更小。 -
高度约束优先级=
747
:约束优先级<压缩阻力<拥抱优先级
较大的抗压力迫使高度遵循其固有尺寸。
这非常有效。 我的问题是我无法弄清楚如何设置这个约束的动画,因为每个解决方案都会为constant
属性设置动画而不是priority
。
我想知道是否有解决方案或解决方法。
通过试验,您似乎无法使用优先级为约束设置动画,并且您可能会遇到激活/停用约束或更改其常量的问题。
我几天前做过类似的工作。 一个简单但有点天真的方法是删除约束并仅使用内在内容大小 – 您可以设置label.numberOfLines = 4
何时应该折叠(因此大小不会超过4行)和label.numberOfLines = 0
展开时label.numberOfLines = 0
这非常容易和干净,但是,我不确定动画会如何。
第二种方法是仅使用约束并为常量设置动画。 您已经有4行高度,您只需要扩展标签的高度。 您可以在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 } }
然后你需要动画的是:
labelHeightConstraint.constant = label.heightNeeded()
不要忘记如何使用autolayout为该常量设置动画,例如,请参阅我对以下另一个SO问题的回答。