Почему моя CATransaction не соблюдает продолжительность, которую я set?

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

Что я здесь делаю не так?

5
задан zpasternack 7 November 2010 в 19:13
поделиться