我正在寻找一种使用嵌套动画块实现连续动画的方法。
在UIScrollView中发生了一些复杂的事情,三个UIImageViews的大小(有很多图像,当我滚动它们时,我不断地在UIImageViews中交换图像)。
当滚动完成后,我想在(可见)中间UIImageView中切换出三次图像,然后再回到原始视图。我正在尝试这样做:
- (void) doAnimation {
// get the animation frames, along with the current image
NSString *swap1 = @"first.png";
NSString *swap2 = @"second.png";
UIImage *original = currentPage.image;
UIViewAnimationOptions myOptions = UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction;
[UIView animateWithDuration:2.0 delay:2.0 options:myOptions
animations:^{ [currentPage setImage:[UIImage imageNamed:swap1]]; }
completion:^(BOOL finished) {
[UIView animateWithDuration:2.0 delay:2.0 options:myOptions
animations:^{ [currentPage setImage:[UIImage imageNamed:swap2]]; }
completion:^(BOOL finished) {
[UIView animateWithDuration:2.0 delay:2.0 options:myOptions
animations:^{ [currentPage setImage:[UIImage imageNamed:swap1]]; }
completion:^(BOOL finished) {
[currentPage setImage:original]; }]; }]; }];
}
当我跑步时,没有持续时间,没有延迟,这一切都立即发生,几乎太快,眼睛看不到。这可能是因为“currentPage”是UIImageView吗? (类似于this question?)
答案 0 :(得分:1)
没有延迟,因为UIImageView.image
不是一个可动画的属性。因此,UIView动画机器将没有动画设置,只会立即调用您的完成块。
您期望什么样的动画?您可以将CATransition
对象附加到底层以获得简单的交叉淡入淡出,只需使用[imageView.layer addAnimation:[CATransition animation] forKey:nil]
来获取具有默认值的交叉淡入淡出(您可以通过修改CATransition的属性来自定义时间将它附加到图层上)。要实现后续动画,您可以使用delegate
(CAAnimation
超类的CATransition
属性来了解它何时完成并触发第二个动画,或者您可以使用{ {1}}在用户定义的延迟后开始下一个动画步骤。关于定时,委托方法将更准确,但performSelector方法更容易编写。遗憾的是,CAAnimation不支持完成块。
答案 1 :(得分:0)
您从一个图像视图转换到另一个图像视图的另一种方法是使用“transitionFromView:toView:duration:options:completion中讨论的块动画函数Creating Animated Transitions Between Views"。您可以执行此操作而不是animateWithDuration来更改图像。” p>