0

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

我也有这个方法:

-(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。

4

1 回答 1

4

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

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

如果您不需要自动布局,则可以将其关闭(如果您需要帮助将其关闭,请参阅此答案)。然后,您可以在情节提要中使用较旧的“弹簧和支柱”布局系统,它可以让您根据需要设置视图的框架。

如果您确实需要自动布局,则需要学习如何使动画与自动布局一起使用。有两种基本方法。一种方法是修改约束,以便自动布局将视图放置在您想要的位置,然后[view layoutIfNeeded]在动画块中执行以将视图动画到其新位置。另一种方法是使用 aNSTimer或 a为约束本身设置动画CADisplayLink

WWDC 2012 视频“ Session 228 - Best Practices for Mastering Auto Layout”解释了您的问题,并深入讨论了这两种技术,从 30 分 45 秒开始。如果您需要使用带有自动布局的动画,我强烈建议您观看该视频以及 WWDC 2012 中其他与自动布局相关的视频。

于 2012-11-15T03:30:39.360 回答