动画 UIView 框架不尊重约束?

Posted

技术标签:

【中文标题】动画 UIView 框架不尊重约束?【英文标题】:Animating UIView frame doesn't respect constraints? 【发布时间】:2014-02-27 10:20:07 【问题描述】:

我想要实现的是当我点击按钮时,动画框架将调整大小,这样底线位置不会改变,高度会降低。这部分正在发生。我还希望上部标签与框架的上边界一起向下移动,下部标签保持不变。所以我在 IB 中设置了约束,使下部标签的垂直空间为 20 像素,优先级为 1000。

- (IBAction)tapTap:(id)sender 
    //[self.containerView layoutIfNeeded];
    [UIView animateWithDuration:1.5 animations:^
        CGRect rect = CGRectOffset(self.containerView.frame, 0, 30);
        rect.size.height -= 30;
        self.containerView.frame = rect;
        //[self.containerView layoutIfNeeded];
     completion:NULL];

较低的标签也具有动画效果,不会保持不变。在尝试 layoutIfNeeded 后我最好的猜测是,我在动画帧时不能依赖约束。如果是真的,有什么解决办法?

【问题讨论】:

好的,我真的不应该直接触摸框架,而是使用约束设置动画! 【参考方案1】:

AutoLayout 的第一条规则:不要触摸框架(或中心)。

看起来您已经找到了答案,但这样做的方法是保留对您想要更改的约束的引用。例如,如果您想上下移动视图,则存储一个垂直约束来设置视图上的垂直位置。现在,当您对该约束进行动画处理时,视图将使用它进行动画处理。

self.topConstraint.constant = 50;
// etc...

您可以通过 CTRL 拖动来创建对约束的属性引用,就像使用按钮、标签等...

【讨论】:

以上是关于动画 UIView 框架不尊重约束?的主要内容,如果未能解决你的问题,请参考以下文章

通过动画调整 UIView 大小时约束不起作用

UIImageView 不尊重约束

Swift:动画后将 UIView 的帧重置为其约束

动画 UIView 的子视图在动画期间不保持约束

通过更新约束滑入 UIView

通过其约束为 UIView(包含带约束的子组件)设置动画