使用嵌套动画块的连续动画
我正在寻找一种使用嵌套动画块实现连续动画的方法。
发生在 UIScrollView 内部的情况有些复杂,三个 UIImageView 的大小(有很多图像,当我滚动它们时,我不断地交换 UIImageView 中的图像)。
滚动完成后,我想切换(可见)中间 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 吗? (类似于这个问题?)
I'm looking for a way to implement consecutive animations using nested animation blocks.
Somewhat complicated by happening inside a UIScrollView, the size of three UIImageViews (there are many images, and as I scroll through them I constantly swapping out the images in the UIImageViews).
When a scroll is finished, I want to switch out the image in the (visible) middle UIImageView, three times, then back to the original view. I'm trying it thus:
- (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]; }]; }]; }];
}
When I run this, there is no duration, no delay, it all happens at once, almost too fast for the eye to see. Could this be because "currentPage" is a UIImageView? (Similar to this question?)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
没有延迟,因为
UIImageView.image
不是可动画的属性。因此,UIView 动画机制将不需要设置动画,只会立即调用完成块。你期待什么类型的动画?您可以将
CATransition
对象附加到底层来获得简单的交叉淡入淡出,只需使用[imageView.layer addAnimation:[CATransitionanimation] forKey:nil]
即可获得使用默认值的交叉淡入淡出(您可以在将 CATransition 附加到图层之前通过修改 CATransition 的属性来自定义计时)。要实现后续动画,您可以使用 CAAnimation(CATransition
的超类)的delegate
属性来了解它何时完成并触发您的动画。第二个,或者您可以使用-performSelector:withObject:afterDelay:
在用户定义的延迟后开始下一个动画步骤。委托方法在计时方面会更加准确,但 PerformSelector 方法更容易编写。遗憾的是,CAAnimation 不支持完成块。There's no delay because
UIImageView.image
isn't an animateable property. As such, the UIView animation machinery will have no animations to set up and will just call your completion block immediately.What sort of animation did you expect? You can attach a
CATransition
object to the underlying layer to get a simple cross-fade, Just use[imageView.layer addAnimation:[CATransition animation] forKey:nil]
to get the crossfade with the default values (you can customize the timing by modifying properties of the CATransition before attaching it to the layer). To achieve the subsequent animations, you can either use thedelegate
property ofCAAnimation
(CATransition
's superclass) to learn when it's done and fire your second one, or you could just use-performSelector:withObject:afterDelay:
to start your next animation step after a user-defined delay. The delegate method is going to be more accurate with regards to timing, but the performSelector method is a bit easier to write. Sadly, CAAnimation doesn't support a completion block.从一个图像视图转换到另一个图像视图的另一种方法是使用块动画函数 transitionFromView:toView:duration:options:completion 如“在视图之间创建动画过渡"。您可以这样做而不是 animateWithDuration 来更改图像。
Another approach for you to transition from one image view to another is by using the block animation function transitionFromView:toView:duration:options:completion as discussed in "Creating Animated Transitions Between Views". You would do this instead of animateWithDuration to change images.