如何递归执行view的动画

如何递归执行view的动画

效果:

 

山寨的源头:

图片素材:

源码:

//
//  ViewController.m
//  RepeatAnimationView
//
//  Created by YouXianMing on 15/1/30.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) UIImageView *imageView;

@property (nonatomic) CGRect   startRect;
@property (nonatomic) CGRect   centerRect;
@property (nonatomic) CGRect   endRect;

@property (nonatomic) CGFloat  distanceFromStartToCenter;
@property (nonatomic) CGFloat  distanceFromCenterToEnd;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.distanceFromStartToCenter = 40.f;
    self.distanceFromCenterToEnd   = 30.f;

    // 背景色
    self.view.backgroundColor = [UIColor blackColor];

    // 红色图片
    self.imageView        = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"red"]];
    self.imageView.center = self.view.center;
    self.imageView.alpha  = 0;
    [self.view addSubview:self.imageView];

    // 设置rect
    self.startRect    = self.imageView.frame;

    CGRect tmpRect    = self.startRect;
    tmpRect.origin.y -= self.distanceFromStartToCenter;
    self.centerRect   = tmpRect;

    tmpRect           = self.centerRect;
    tmpRect.origin.y -= self.distanceFromCenterToEnd;
    self.endRect      = tmpRect;

    // 递归调用
    [self doAnimation];
}

- (void)doAnimation {
    [UIView animateWithDuration:1.f
                          delay:0.2f
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{

                         self.imageView.alpha = 1.f;
                         self.imageView.frame = self.centerRect;

                     } completion:^(BOOL finished) {

                         [UIView animateWithDuration:0.5f
                                               delay:0.1f
                                             options:UIViewAnimationOptionCurveEaseInOut
                                          animations:^{

                                              self.imageView.alpha = 0.f;
                                              self.imageView.frame = self.endRect;

                                          } completion:^(BOOL finished) {

                                              self.imageView.frame = self.startRect;
                                              [self doAnimation];
                                          }];
                     }];
}

@end
//
//  ViewController.m
//  RepeatAnimationView
//
//  Created by YouXianMing on 15/1/30.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) UIImageView *imageView;
@property (nonatomic, strong) UIImageView *cyanView;

@property (nonatomic) CGRect   startRect;
@property (nonatomic) CGRect   centerRect;
@property (nonatomic) CGRect   endRect;

@property (nonatomic) CGFloat  distanceFromStartToCenter;
@property (nonatomic) CGFloat  distanceFromCenterToEnd;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.distanceFromStartToCenter = 40.f;
    self.distanceFromCenterToEnd   = 30.f;

    // 背景色
    self.view.backgroundColor = [UIColor blackColor];

    // 红色图片
    self.imageView        = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"red"]];
    self.imageView.center = self.view.center;
    self.imageView.alpha  = 0;
    [self.view addSubview:self.imageView];

    self.cyanView       = [[UIImageView alloc] initWithFrame:self.imageView.bounds];
    self.cyanView.image = [UIImage imageNamed:@"cyan"];
    [self.imageView addSubview:self.cyanView];

    // 设置rect
    self.startRect    = self.imageView.frame;

    CGRect tmpRect    = self.startRect;
    tmpRect.origin.y -= self.distanceFromStartToCenter;
    self.centerRect   = tmpRect;

    tmpRect           = self.centerRect;
    tmpRect.origin.y -= self.distanceFromCenterToEnd;
    self.endRect      = tmpRect;

    // 递归调用
    [self doAnimation];
}

- (void)doAnimation {
    [UIView animateWithDuration:1.f
                          delay:0.2f
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{

                         self.imageView.alpha = 1.f;
                         self.imageView.frame = self.centerRect;
                         self.cyanView.alpha  = 0.5;

                     } completion:^(BOOL finished) {

                         [UIView animateWithDuration:0.5f
                                               delay:0.1f
                                             options:UIViewAnimationOptionCurveEaseInOut
                                          animations:^{

                                              self.imageView.alpha = 0.f;
                                              self.imageView.frame = self.endRect;
                                              self.cyanView.alpha  = 0.f;

                                          } completion:^(BOOL finished) {

                                              self.imageView.frame = self.startRect;
                                              self.cyanView.alpha  = 1.f;
                                              [self doAnimation];
                                          }];
                     }];
}

@end

时间: 2025-01-20 21:21:10

如何递归执行view的动画的相关文章

同时对view延时执行两个动画时候的现象

同时对view延时执行两个动画时候的现象 对于view延时执行了两个动画后,会将第一个动画效果终止了,直接在第一个动画的view的最后的状态上接执行后续的动画效果,也就是说,我们可以利用这个特性来写分段动画效果,比如,可以定时2秒,2秒的状态值为100%,中途可以停止,达不到2秒的效果就触发不了最终效果,这对于写控件来说是很好的一个属性哦,下次教程将会写一个按钮的特效的控件,效果类似于: 效果: 源码: // // ViewController.m // ViewAnimation // //

result undefined-大牛帮忙看看为啥我的js递归执行结果为undefined

问题描述 大牛帮忙看看为啥我的js递归执行结果为undefined function a(arr, result){ if(!result){ result = []; } if(arr.length > 0){ result.push(arr[0]); arr.splice(0,1); }else{ return result; } } var aa = a([1,2,3,4,5]); console.log("result ==",aa); 解决方案 你这没有递归,递归需要自

Swift教程_零基础学习Swift完整实例(八)_swift完整实例(添加View的动画效果、添加View的阴影)

6.添加View的动画效果 本章节主要来做明细页面点击后翻转的动画效果,该效果可以进行多种改变,以达到想要的效果. 1.首先我们需要进行翻转的正反两个view,前面我们已经做好了,分别是PKOElementDetailImageView和PKOElementDetailImageFlippedView,具体翻转动画在明细页面的控制其中进行,触发当然是PKOElementDetailImageView中的点击事件,前文已经提到.2.PKOElementDetailImageView中的点击事件调用

PHP对文件夹递归执行chmod命令的方法_php技巧

本文实例讲述了PHP对文件夹递归执行chmod命令的方法.分享给大家供大家参考.具体分析如下: 这里对文件夹和文件递归执行chmod命令来改变执行权限 <?php function recursiveChmod($path, $filePerm=0644, $dirPerm=0755) { // Check if the path exists if(!file_exists($path)) { return(FALSE); } // See whether this is a file if(

Excel中执行“宏”命令动画教程

<Excel2003入门动画教程59.Excel中执行"宏"命令>. 演示动画 操作步骤 在Excel中宏录制完成后,我们运行一下看看其效果如何: 执行"工具→宏→宏"命令,打开"宏"对话框,选中需要运行的宏,按一下"执行"按钮即可. 注意:如果在"录制新宏"对话框中设置了"快捷键",我们就可以通过按快捷键来运行相应的宏.

Android 模仿iPhone列表数据View刷新动画详解_Android

因为我本人很喜欢在不同的页面之间跳转时加点好玩的动画,今天无意间看到一个动画效果感觉不错,几种效果图如下:既然好玩就写在博客中,直接说就是:该效果类似于iPhone中View的切换动画效果,今天就只介绍上面展示的效果. 废话不多说,先上效果,再看代码!! 效果一: 效果二: 效果三: 效果四:(犯错的效果): 效果五(回旋效果一): 效果六(回旋效果二): 效果看完了,就来看下上面效果实现的具体代码吧, 中间会把我自己试验的.犯的错误都以注释的形式写下来的, 大家使用的时候别出错就行了!先来看下

Android自定义view实现阻尼效果的加载动画_Android

效果: 需要知识: 1. 二次贝塞尔曲线 2. 动画知识 3. 基础自定义view知识 先来解释下什么叫阻尼运动 阻尼振动是指,由于振动系统受到摩擦和介质阻力或其他能耗而使振幅随时间逐渐衰减的振动,又称减幅振动.衰减振动.[1] 不论是弹簧振子还是单摆由于外界的摩擦和介质阻力总是存在,在振动过程中要不断克服外界阻力做功,消耗能量,振幅就会逐渐减小,经过一段时间,振动就会完全停下来.这种振幅随时间减小的振动称为阻尼振动.因为振幅与振动的能量有关,阻尼振动也就是能量不断减少的振动.阻尼振动是非简谐运

iOS动画开发之二——UIView动画执行的另一种方式

iOS动画开发之二--UIView动画执行的另一种方式         上一篇博客中介绍了UIView的一些常用动画,通过block块,我们可以很方便简洁的创建出动画效果:http://my.oschina.net/u/2340880/blog/484457,这篇博客再介绍一种更加传统的执行UIView的动画的方法.         这种方式相比如block的方式,显得要麻烦一些,apple官方也推荐我们使用带block的创建动画的方式,我们可以将编程重心更多的放在动画逻辑的实现上.使用begi

Android 动画(View动画,帧动画,属性动画)详细介绍_Android

0. 前言  Android动画是面试的时候经常被问到的话题.我们都知道Android动画分为三类:View动画.帧动画和属性动画. 先对这三种动画做一个概述: View动画是一种渐进式动画,通过图像的平移.缩放.旋转和透明度等各种渐进式变换完成动画效果. 帧动画是通过不停的切换图片实现动画效果. 属性动画是不停的改变对象的属性来实现动画效果.本文原创,转载请注明出处: http://blog.csdn.net/seu_calvin/article/details/52724655 1.  Vi