In the process, I realized that the callback can be done with a block. I'm not sure what the approved method to do this would be; I looked at the delegate methods and they're not promising. I guess if we were instantiating the animation from an object we'd just pass self as an argument to the alternative init method. In a GUI app we'd use an IBOutlet and never need to do the explicit init in our code.
Output:
> ./prog 2012-05-27 12:08:12.794 prog[7813:707] Progress: 0.20 2012-05-27 12:08:12.994 prog[7813:707] Progress: 0.40 2012-05-27 12:08:13.194 prog[7813:707] Progress: 0.60 2012-05-27 12:08:13.394 prog[7813:707] Progress: 0.80 2012-05-27 12:08:13.595 prog[7813:707] Progress: 1.00 |
// clang prog.m -o prog -framework Cocoa -fobjc-gc-only #import <Cocoa/Cocoa.h> typedef void (^B)(NSAnimationProgress p); B b = ^(NSAnimationProgress p){ NSLog(@"Progress: %.2f", p); }; @interface MyAnimation : NSAnimation @end @implementation MyAnimation B myBlock; - (id)init { self = [super initWithDuration:1.0 animationCurve:NSAnimationLinear]; if (self) { [self setFrameRate:5.0]; [self setAnimationBlockingMode:NSAnimationNonblocking]; } return self; } - (id)initWithBlock:(B)b { self = [self init]; myBlock = b; return self; } - (void)setCurrentProgress:(NSAnimationProgress)progress { myBlock(progress); } @end int main(int argc, char * argv[]) { NSAnimation *a = [[MyAnimation alloc] initWithBlock:b]; [a startAnimation]; NSRunLoop* rl = [NSRunLoop currentRunLoop]; [rl runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.2]]; return 0; } |