将旧动画代码转换为新的iOS4块技术

时间:2011-07-07 20:25:20

标签: iphone objective-c cocoa-touch core-animation objective-c-blocks

我正在尝试用2009年的书来学习动画,据我所知,在iOS4中制作动画的首选方法是使用块。我正在阅读的这本书使用了旧方法,我一直试图将其翻译成新方法,但收效甚微。

这本书的内容如下:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:animationTimer];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDelegate:self];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDidStopSelector:@selector(lastAnimationZero)];

//animations

[UIView commitAnimations];

我的(显然是失败的)翻译:

[UIView animateWithDuration:animationTimer
                    options: (UIViewAnimationOptionAllowUserInteraction | 
                              UIViewAnimationOptionCurveEaseOut)
                 animations: ^
                 {
                     animation
                 }
                 completion:^(BOOL finished)
                 {
                     lastAnimation = 0;
                 }];

每次我运行它时(使用块方法)获取“程序接收信号:”SIGABRT“并且控制台显示

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+    
[UIView animateWithDuration:options:animations:completion:]: unrecognized selector sent to class 0x8393b4'

1 个答案:

答案 0 :(得分:2)

检查UIVIew的文档。没有这样的方法。 你写块语法的方式还可以,只需发送正确的信息。

此外,将“动画”替换为您需要的说明,本书不会告诉您,旧版本中的[UIView setAnimationDidStopSelector: @selector(lastAnimationZero)];实际上是动画停止时发出的消息,并且不应该t直接翻译为lastAnimation = 0;

以下是您可能想要使用的方法文档的link

+(void)animateWithDuration:(NSTimeInterval)duration
                     delay:(NSTimeInterval)delay
                   options:(UIViewAnimationOptions)options
                animations:(void (^)(void))animations
                completion:(void (^)(BOOL finished))completion;