通过更改其优先级值来设置布局约束的动画

我有一个包含大量文字的标签。 有一个用于折叠和扩展标签高度的切换(这里命名为“lire la suite” ),因此它会截断文本的结尾。

在此处输入图像描述

我精心设置了垂直内容拥抱优先级和抗压缩性,因此内在尺寸优先于压缩阻力。

高度约束(直接在标签右侧的可选约束)设置为常量71 ,仅为4行的高度。 它永远不会改变。

然后,这个相同的约束优先级在747749之间切换,因此会发生以下情况:

  • 高度约束优先级= 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问题的回答。