gpt4 book ai didi

ios - 通过更改其优先级值来动 Canvas 局约束

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:30:31 24 4
gpt4 key购买 nike

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

enter image description here

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

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

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

  • 高度约束优先级 = 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 设置动画。

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

最佳答案

通过试验,您似乎无法使用优先级为约束设置动画,并且您要么激活/停用约束,要么更改它们的常量。

几天前我有过类似的任务。一种简单但有点幼稚的方法是放弃约束并仅使用固有内容大小 - 您可以在应该折叠时设置 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()

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

关于ios - 通过更改其优先级值来动 Canvas 局约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48061675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com