我正在将 iPhone 应用程序移植到 Mac OS X。此代码已在 iPhone 上成功使用:
- (void) moveTiles:(NSArray*)tilesToMove {
[UIView beginAnimations:@"tileMovement" context:nil];
[UIView setAnimationDuration:0.1];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(tilesStoppedMoving:finished:context:)];
for( NSNumber* aNumber in tilesToMove ) {
int tileNumber = [aNumber intValue];
UIView* aView = [self viewWithTag:tileNumber];
aView.frame = [self makeRectForTile:tileNumber];
}
[UIView commitAnimations];
}
Mac 版本使用 CATransaction 对动画进行分组,如下所示:
- (void) moveTiles:(NSArray*)tilesToMove {
[CATransaction begin];
[CATransaction setAnimationDuration:0.1];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[CATransaction setCompletionBlock:^{
[gameDelegate tilesMoved];
}];
for( NSNumber* aNumber in tilesToMove ) {
int tileNumber = [aNumber intValue];
NSView* aView = [self viewWithTag:tileNumber];
[[aView animator] setFrame:[self makeRectForTile:tileNumber]];
}
[CATransaction commit];
}
动画执行良好,但持续时间为 1.0 秒。我可以更改 setAnimationDuration: 调用任何内容,或者完全省略它,并且每次动画的持续时间仍然为 1.0 秒。我也不认为 setAnimationTimingFunction: 调用在做任何事情。但是, setCompletionBlock: 正在工作,因为该块在动画完成时正在执行。
我在这里做错了什么?