IOS 8 高度约束动画未按预期工作

Posted

技术标签:

【中文标题】IOS 8 高度约束动画未按预期工作【英文标题】:IOS 8 height constraint animation not working as expected 【发布时间】:2015-10-07 17:47:45 【问题描述】:

我尝试为视图顶部的黑色标签的高度约束设置动画,并在下方的白色标签上设置了一个约束,用于设置与上方标签的距离。然后我尝试使用以下代码为高度更改黑色标签设置动画(我还尝试过在 UIView.animateWithDuration 中更改 self.height 的代码> 块:

@IBOutlet weak var height: NSLayoutConstraint!

@IBAction func resize(sender: AnyObject) 

    if self.collapsed 
        self.height.constant = 100
     else 
        self.height.constant = 0
    

    UIView.animateWithDuration(2) 
        [unowned self] in
        self.view.layoutIfNeeded()
    

    collapsed = !collapsed

resize 动作是通过按下按钮来调用的。有一些东西是动画的,但不是我所期望的:标签立即将其大小更改为 0 或 100。当它变为 0 时,第二个标签慢慢地向上移动到它的新位置。当黑色标签高度设置为 100 时,它会从第二个标签上方的屏幕顶部出现,然后它们都会向下移动到最终位置。黑色标签从视图顶部也有一个约束,所以我不明白为什么黑色标签从顶部向下流动。

有什么想法吗?

【问题讨论】:

动画期间日志中没有违反约束的错误消息?任何可以忽略的优先级较低的约束?第二种情况不会给出任何错误,因为较低的优先级允许约束中断。 你能解释一下应用于 blacklabel 和 second label 的所有约束吗? 我正在尝试重建约束...你能告诉我你将放置哪些约束以及优先级以使底部标签始终与黑色标签底部的距离为 X 并且距离屏幕顶部 Y 距离的黑色标签。然后黑色标签必须出现和消失(通过将高度从 100 更改为 0,反之亦然)。我想实现一种“正在加载...”标签,一旦后台任务消失完成了。 顺便说一句,我不明白为什么底部标签的移动是动画的,而黑色标签的高度变化是即时的。 这不是UIView 的标准行为,它可能是UILabel 的特定错误;例如,UITextField 没有这样的行为,它会按照您的预期进行动画处理。 【参考方案1】:

我重新创建了您的示例并对其进行了一些研究。

我已经设法用blackLabel.clipsToBounds = true 修复了“展开”动画,但“缩小”动画仍然跳动。如 here 和 here 所述,这似乎是 UILabel 的问题。

我能想到的最简单的解决方法就是用相同大小的 UIView 包装你的 blackLabel 并为其高度设置动画。不要忘记设置wrapperView.clipsToBounds = true。这应该可以。

【讨论】:

以上是关于IOS 8 高度约束动画未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

程序约束未按预期工作

UITableViewCell 高度内的 UITableView 未按预期工作

iOS 8 自定义键盘:更改高度而不发出警告“无法同时满足约束...”

动画约束,如何在所需方向增加高度

自动布局约束未按预期工作

动画未按预期工作[重复]