UIView 动画的参数传递 与 自定义方法

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
View Code

 
posted @ 2014-12-17 20:34  红红de  阅读(344)  评论(0编辑  收藏  举报