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

时间:2018-01-02 13:12:39

标签: ios nslayoutconstraint

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

enter image description here

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

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

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

  • 身高约束优先级= 749

      

    抗压性<约束优先级<拥抱优先级

         

    压缩阻力在约束优先级下崩溃,如果其内在大小(拥抱优先级)较小,则其高度为71或更小。

  • 身高约束优先级= 747

      

    约束优先级<抗压性<拥抱优先级

         

    更大的抗压力迫使高度遵循其固有尺寸。

这完美无缺。我的问题是我无法弄清楚如何设置此约束的动画,因为每个解决方案都会为constant属性设置动画而不是priority

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

1 个答案:

答案 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问题。