我正在尝试使用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。
答案 0 :(得分:4)
您的故事板已启用自动布局。自动布局运行时,它会根据您在故事板中设置的约束(或为您自动设置的约束)设置视图的帧。这意味着如果您更改视图的框架,autolayout将在下次运行时撤消您的更改。
系统会在不同时间自动触发自动布局,包括滚动滚动视图时。这就是为什么当你滚动时你会看到你的视图“跳回来”。
如果您不需要自动布局,可以将其关闭(如果您需要帮助将其关闭,请参阅this answer)。然后,您可以在故事板中使用较旧的“弹簧和支柱”布局系统,这样您就可以根据需要设置视图的框架。
如果您确实需要自动布局,则需要了解如何使用autolayout制作动画。有两种基本方法。一种方法是修改约束,以便autolayout将视图放在您想要的位置,然后在动画块中执行[view layoutIfNeeded]
以将视图设置为其新位置的动画。另一种方法是使用NSTimer
或CADisplayLink
来激活约束本身。
WWDC 2012 video“会话228 - 掌握自动布局的最佳实践”解释了您的问题,并从30分钟开始深入讨论这两种技术。如果您需要使用带有自动布局的动画,我高度建议您观看视频以及WWDC 2012中与其他自动布局相关的视频。