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

Animate a layout constraint by changing its priority value

我有一个包含大量文本的标签。有一个用于折叠和展开标签高度的开关(这里它被命名为 "lire la suite")所以它会截断文本的末尾。

我精心设置了垂直内容拥抱优先级和压缩阻力,因此固有尺寸比压缩阻力具有更高的优先级。

高度约束(直接在标签右边的可选约束)设置了常数71,就是4行的高度。它永远不会改变。

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

这非常有效。我的问题是我不知道如何为这个约束设置动画,因为每个解决方案都会为 constant 属性 而不是 priority.

设置动画

我想知道是否有解决方案或解决方法。

通过试验,您似乎无法使用优先级对约束进行动画处理,并且您要么受制于 activating/deactivating 约束,要么改变它们的常量。

几天前我有过类似的任务。一种简单但有点幼稚的方法是放弃约束并仅使用固有内容大小 - 您可以设置 label.numberOfLines = 4 应该折叠的时间(因此大小不会扩展超过 4 行),以及 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()

不要忘记如何使用自动布局为该常量设置动画,例如参见我的 到另一个 SO 问题。