通过更改其优先级值来动画布局约束
Animate a layout constraint by changing its priority value
我有一个包含大量文本的标签。有一个用于折叠和展开标签高度的开关(这里它被命名为 "lire la suite")所以它会截断文本的末尾。
我精心设置了垂直内容拥抱优先级和压缩阻力,因此固有尺寸比压缩阻力具有更高的优先级。
高度约束(直接在标签右边的可选约束)设置了常数71
,就是4行的高度。它永远不会改变。
然后这个相同的约束在 747
和 749
之间进行优先级切换,所以会发生以下情况:
高度约束优先级=749
:
compression resistance < constraint priority < hugging priority
Compression resistance collapses under the constraint priority, its height is 71
or less if its intrinsic size (hugging priority) is smaller.
高度约束优先级=747
:
constraint priority < compression resistance < hugging priority
The greater compression resistance forces the height to follow its intrinsic size.
这非常有效。我的问题是我不知道如何为这个约束设置动画,因为每个解决方案都会为 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 问题。
我有一个包含大量文本的标签。有一个用于折叠和展开标签高度的开关(这里它被命名为 "lire la suite")所以它会截断文本的末尾。
我精心设置了垂直内容拥抱优先级和压缩阻力,因此固有尺寸比压缩阻力具有更高的优先级。
高度约束(直接在标签右边的可选约束)设置了常数71
,就是4行的高度。它永远不会改变。
然后这个相同的约束在 747
和 749
之间进行优先级切换,所以会发生以下情况:
高度约束优先级=
749
:compression resistance < constraint priority < hugging priority
Compression resistance collapses under the constraint priority, its height is
71
or less if its intrinsic size (hugging priority) is smaller.高度约束优先级=
747
:constraint priority < compression resistance < hugging priority
The greater compression resistance forces the height to follow its intrinsic size.
这非常有效。我的问题是我不知道如何为这个约束设置动画,因为每个解决方案都会为 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()
不要忘记如何使用自动布局为该常量设置动画,例如参见我的