Я портирую приложение 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: работает, поскольку этот блок выполняется после завершения анимации.
Что я здесь делаю не так?