1.UIView 动画可以传递参数的地方有三个:
1 + (void)beginAnimations:(NSString *)animationID context:(void *)context 2 3 + (void)setAnimationWillStartSelector:(SEL)selector; // default = NULL. -animationWillStart:(NSString *)animationID context:(void *)context 系统默认的动画开始时执行的方法 4 5 + (void)setAnimationDidStopSelector:(SEL)selector; // default = NULL. -animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 系统默认的动画结束时调用的方法
观察者三个地方的参数,分别是:
(NSString *)animationID:给这个动画一个ID,就像每个人都有一个身份证一样,用来标识这个动画,类型是字符串类型,对应于动画结束方法的第一个参数
(void *)context:类型是 void * 表示任意指针类型;这个参数可以将需要进行动画的对象向下传递,对应于动画结束方法中的第三个参数。
(NSNumber *)finished (这个只在动画结束的方法中出现):这个参数是由系统生成的,表示动画块是否成功结束,一般不使用。
这几个参数的使用是一一对应的,在 UIView 的参数传递,其个数与参数类型都是固定的。
2.动画的自定义方法
可以给动画添加自定义方法,可以添加自定义方法的地方有两个,分别是
[ UIView setAnimationWillStartSelector:@selector(methodName)] —— 给动画添加自定义的动画开始方法
[ UIViewsetAnimationDidStopSelector:@selector(methodName)] —— 给动画添加自定义的动画结束方法
在给动画添加自定义方法之前一定要先改动画设置代理,指定由谁来调用这个方法,即
[ UIView setAnimationDelegate: self ]; //一般都是设置成 self, 由这个类本身来调用这个方法
如果设置了代理,没有添加自定义方法,会自动调用两个默认的动画开始与结束方法。
添加自己的方法,可以是两种:
无参数;
有参数:如果现在有一个动画结束时需要调用的方法,且希望可以传递参数,则 参数有且只有三个,并且就是默认结束方法中的参数

1 #import "HUAppDelegate.h" 2 3 @implementation HUAppDelegate 4 5 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 6 { 7 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 8 // Override point for customization after application launch. 9 self.window.backgroundColor = [UIColor colorWithRed:0 green:0.7 blue:1 alpha:0.5]; 10 [self.window makeKeyAndVisible]; 11 12 UIImageView *bg = [[UIImageView alloc]initWithFrame:[[UIScreen mainScreen] bounds]]; 13 bg.image = [UIImage imageNamed:@"bg.jpg"]; 14 [self.window addSubview:bg]; 15 16 [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(snowDown) userInfo:nil repeats:YES]; 17 18 return YES; 19 } 20 21 //定时器调用的方法,每次创建一个 UIImageView 的对象(一朵雪花) 22 - (void)snowDown 23 { 24 UIImageView *snow = [[UIImageView alloc] initWithFrame:CGRectMake(arc4random() % 320, -20, 20, 20)]; 25 snow.image = [UIImage imageNamed:@"flake.png"]; 26 [self.window addSubview:snow]; 27 28 //将这多雪花向下传递,并给这多雪花一个身份叫做融化 29 [UIView beginAnimations:@"melt" context:snow]; 30 [UIView setAnimationDuration:5]; 31 [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 32 [UIView setAnimationDelegate:self]; 33 [UIView setAnimationDidStopSelector:@selector(didEndStop: finished: context:)]; 34 snow.frame = CGRectMake(arc4random() % 320, 460, 20, 20); 35 [UIView commitAnimations]; 36 } 37 38 //动画结束时调用的方法 39 - (void)didEndStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)aSnow 40 { 41 UIImageView *imageView = (UIImageView *)aSnow; 42 if ([animationID isEqualToString:@"melt"]) 43 { 44 //雪花融化结束后移除该雪花的 UIImageView 对象 45 [UIView beginAnimations:@"disappear" context:imageView]; 46 [UIView setAnimationDuration:2]; 47 [UIView setAnimationDelegate:self]; 48 [UIView setAnimationDidStopSelector:@selector(didEndStop: finished: context:)]; 49 imageView.alpha = 0; 50 [UIView commitAnimations]; 51 } 52 if ([animationID isEqualToString:@"disappear"]) 53 { 54 [imageView removeFromSuperview]; 55 } 56 } 57 58 @end