UIView动画不一致的结果

时间:2012-11-14 22:57:54

标签: iphone objective-c animation uiview

我正在尝试使用UIView动画在屏幕上滑动我的视图。我的视图控制器中有一个UIScrollView,我有我的UIViews。

我也有这种方法:

-(void)translateView:(UIView *)view toRect:(CGRect)rect withDuration:(CGFloat)duration
{
    [UIView animateWithDuration:duration
    animations:^
    {
        view.frame = rect;
    }
    completion:^(BOOL finished)
    {
        //Finished
    }];
}

我称之为在一段时间内以动画的方式将我的UIView移动到我选择的CGRect。我有一个创建和滑出7个视图的循环。这很好用,我把它称为下面,当然循环在不同的视图上调用7次:

[self translateView:cell toRect:translationRect withDuration:0.7];

然而,我不能再事后再打电话,没有任何反应。虽然,假设我在2秒NSTimer之后再次调用它,动画确实会运行,但是当我滚动我的UIScrollView时,我刚刚动画的视图会跳回到之前的CGRect。

1 个答案:

答案 0 :(得分:4)

您的故事板已启用自动布局。自动布局运行时,它会根据您在故事板中设置的约束(或为您自动设置的约束)设置视图的帧。这意味着如果您更改视图的框架,autolayout将在下次运行时撤消您的更改。

系统会在不同时间自动触发自动布局,包括滚动滚动视图时。这就是为什么当你滚动时你会看到你的视图“跳回来”。

如果您不需要自动布局,可以将其关闭(如果您需要帮助将其关闭,请参阅this answer)。然后,您可以在故事板中使用较旧的“弹簧和支柱”布局系统,这样您就可以根据需要设置视图的框架。

如果您确实需要自动布局,则需要了解如何使用autolayout制作动画。有两种基本方法。一种方法是修改约束,以便autolayout将视图放在您想要的位置,然后在动画块中执行[view layoutIfNeeded]以将视图设置为其新位置的动画。另一种方法是使用NSTimerCADisplayLink来激活约束本身。

WWDC 2012 video“会话228 - 掌握自动布局的最佳实践”解释了您的问题,并从30分钟开始深入讨论这两种技术。如果您需要使用带有自动布局的动画,我高度建议您观看视频以及WWDC 2012中与其他自动布局相关的视频。