【问题标题】:Animate a layout constraint by changing its priority value通过更改其优先级值来动画布局约束
【发布时间】:2018-06-12 04:49:10
【问题描述】:

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

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

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

那么这个相同的约束在747749之间有一个优先级切换,所以会发生以下情况:

  • 高度约束优先级 = 749:

    抗压

    抗压性在约束优先级下崩溃,如果其固有大小(拥抱优先级)更小,则其高度为71或更小。

  • 高度约束优先级 = 747:

    约束优先

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

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

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

【问题讨论】:

  • 您是否测试过layoutIfNeeded 以实现所需的动画..?

标签: ios nslayoutconstraint


【解决方案1】:

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

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

【讨论】:

  • 我认为没有很好的方法来为高度设置动画。每次出现/消失一行时,文本都会上下跳跃。我将整体放在 UIView 交叉溶解过渡中。
  • 然后我会将它放到一个包装视图中,设置wrapper.clipsToBounds = true,并为包装的高度设置动画。要让 ... 在关闭时出现,在动画展开之前,您需要更改行数、更新布局,然后为包装器的高度设置动画。
  • 所以我猜答案是:不可能为priority 设置动画。有几种解决方法,我尝试了使用包装器视图的替代方法,但是我没有计算包装器的高度,而是将底部包装器视图设置为与具有可选优先级的标签底部匹配,并将包装器高度约束设置为在静态之间切换值和内部标签的高度——它仍然是计算高度的高度。
  • 我不知道这种可能性。最简单的方法是测试一下,我猜你试过了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多