为什么我的CATransaction不遵守我设定的持续时间?

zpa*_*ack 5 macos cocoa objective-c catransaction

我正在将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];
}
Run Code Online (Sandbox Code Playgroud)

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];
}
Run Code Online (Sandbox Code Playgroud)

动画执行正常,但持续时间为1.0秒.我可以更改setAnimationDuration:调用任何东西,或者完全省略它,并且每次动画的持续时间仍为1.0秒.我也不认为setAnimationTimingFunction:call正在做任何事情.但是,setCompletionBlock:正在运行,因为该块在动画完成时正在执行.

我在这做错了什么?

Ste*_*out 5

如果我没有弄错你就不能使用CoreAnimation直接为NSView制作动画.为此你需要NSAnimationContext和[NSView animator].CATransaction仅适用于CALayers.