之前受某人影响以为一连串的UIView Animation 只能这么写:
在某个animation 设置delegate ,然后在 delegate 函数中再调用另一个函数。
今天偷闲决定看 iPhone cookbook 代码查漏补缺下,结果发现这代码:
// Hide the bar button and show the view self.navigationItem.rightBarButtonItem = nil; [self.view viewWithTag:101].alpha = 1.0f; // Bounce to 115% of the normal size [UIView beginAnimations:nil context:UIGraphicsGetCurrentContext()]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationDuration:0.4f]; [self.view viewWithTag:101].transform = CGAffineTransformMakeScale(1.15f, 1.15f); [UIView commitModalAnimations]; // Return back to 100% [UIView beginAnimations:nil context:UIGraphicsGetCurrentContext()]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationDuration:0.3f]; [self.view viewWithTag:101].transform = CGAffineTransformMakeScale(1.0f, 1.0f); [UIView commitModalAnimations]; // Pause for a second and appreciate the presentation [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0f]]; // Slowly zoom back down and hide the view [UIView beginAnimations:nil context:UIGraphicsGetCurrentContext()]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationDuration:1.0f]; [self.view viewWithTag:101].transform = CGAffineTransformMakeScale(0.01f, 0.01f); [UIView commitModalAnimations]; // Restore the bar button [self.view viewWithTag:101].alpha = 0.0f;
tnnd 原来可以这么写。
同时学到个新玩意。
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0f]];
PS. 原来这个例子就叫做 Modal View Animation 罪过罪过,搞了这么久iPhone还不知道这东西。
####################################################
#### 抱歉,看错了,原来是作者自己实现的方法 ########
####################################################
仔细一看原来
commitModalAnimations
具体代码实现是这样的。
@interface UIViewDelegate : NSObject { CFRunLoopRef currentLoop; } @end @implementation UIViewDelegate -(id) initWithRunLoop: (CFRunLoopRef)runLoop { if (self = [super init]) currentLoop = runLoop; return self; } -(void) animationFinished: (id) sender { CFRunLoopStop(currentLoop); } @end @implementation UIView (ModalAnimationHelper) + (void) commitModalAnimations { CFRunLoopRef currentLoop = CFRunLoopGetCurrent(); UIViewDelegate *uivdelegate = [[UIViewDelegate alloc] initWithRunLoop:currentLoop]; [UIView setAnimationDelegate:uivdelegate]; [UIView setAnimationDidStopSelector:@selector(animationFinished:)]; [UIView commitAnimations]; CFRunLoopRun(); [uivdelegate release]; } @end