iPhoneアプリをMacOSXに移植しています。このコードは、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:は機能しています。これは、アニメーションの完了時にそのブロックが実行されているためです。
私はここで何が間違っているのですか?