您的位置:首页 > 产品设计 > UI/UE

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

2014-12-17 20:34 260 查看
1.UIView 动画可以传递参数的地方有三个:

+ (void)beginAnimations:(NSString *)animationID context:(void *)context

+ (void)setAnimationWillStartSelector:(SEL)selector;                // default = NULL. -animationWillStart:(NSString *)animationID context:(void *)context 系统默认的动画开始时执行的方法

+ (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, 由这个类本身来调用这个方法

如果设置了代理,没有添加自定义方法,会自动调用两个默认的动画开始与结束方法。

添加自己的方法,可以是两种:

无参数;

有参数:如果现在有一个动画结束时需要调用的方法,且希望可以传递参数,则 参数有且只有三个,并且就是默认结束方法中的参数

#import "HUAppDelegate.h"

@implementation HUAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor colorWithRed:0 green:0.7 blue:1 alpha:0.5];
[self.window makeKeyAndVisible];

UIImageView *bg = [[UIImageView alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
bg.image = [UIImage imageNamed:@"bg.jpg"];
[self.window addSubview:bg];

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(snowDown) userInfo:nil repeats:YES];

return YES;
}

//定时器调用的方法,每次创建一个 UIImageView 的对象(一朵雪花)
- (void)snowDown
{
UIImageView *snow = [[UIImageView alloc] initWithFrame:CGRectMake(arc4random() % 320, -20, 20, 20)];
snow.image = [UIImage imageNamed:@"flake.png"];
[self.window addSubview:snow];

//将这多雪花向下传递,并给这多雪花一个身份叫做融化
[UIView beginAnimations:@"melt" context:snow];
[UIView setAnimationDuration:5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(didEndStop: finished: context:)];
snow.frame = CGRectMake(arc4random() % 320, 460, 20, 20);
[UIView commitAnimations];
}

//动画结束时调用的方法
- (void)didEndStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)aSnow
{
UIImageView *imageView = (UIImageView *)aSnow;
if ([animationID isEqualToString:@"melt"])
{
//雪花融化结束后移除该雪花的 UIImageView 对象
[UIView beginAnimations:@"disappear" context:imageView];
[UIView setAnimationDuration:2];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(didEndStop: finished: context:)];
imageView.alpha = 0;
[UIView commitAnimations];
}
if ([animationID isEqualToString:@"disappear"])
{
[imageView removeFromSuperview];
}
}

@end


View Code

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: