0

あるビューをウィンドウからスライドさせて、同時に別のビューをスライドさせるアニメーションを作成しようとしています。そのようです:

     Window
------------------  
|----------------| ------------------
||              || |                |
||     view     || |      view      |
||  sliding out || |   sliding in   |
|----------------| ------------------
------------------  
      <---                <---

レイヤーに裏打ちされたビューを使用しており、暗黙のアニメーションとCATransactionを使用しようとしています。何が起こっているのかというと、スライドアウトするビューはアニメーション化されますが、スライドインするビューは所定の位置にジャンプします。これが私のコードです:

    NSView *slidingInView = nil;
    NSView *slidingOutView = nil;
    if (currentState.primaryView != nextState.primaryView) {
        // Slide in a primary view
        [self.window.contentView addSubview:nextState.primaryView];
        CGRect frame = nextState.primaryView.layer.frame; 
        frame.origin.x = slideFromRight ? frame.size.width : 0 - frame.size.width;
        [nextState.primaryView.layer setPosition: frame.origin];

        slidingInView = nextState.primaryView;
        slidingOutView = currentState.primaryView;
    }

    [CATransaction begin];
    [CATransaction setValue:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]
                     forKey:kCATransactionAnimationTimingFunction];
    [CATransaction setAnimationDuration:1.0f];
    [CATransaction setCompletionBlock:^{
        [slidingOutView removeFromSuperview];
    }];

    // Slide in the new view
    slidingInView.layer.position = CGPointMake(0.0f, 0.0f);

    // if there is a view in place already, slide it out to the left.
    if (slidingOutView != nil) {

        CGRect frame = slidingOutView.layer.frame;
        frame.origin = CGPointMake(slidingOutView.layer.frame.size.width, slidingOutView.layer.frame.origin.y);
        if (slideRight)
            frame.origin = CGPointMake(0-slidingOutView.layer.frame.size.width, slidingOutView.layer.frame.origin.y);

        [slidingOutView.layer setPosition: frame.origin];
    }

    [CATransaction commit];

これは私にとって完全な謎です。誰か手がかりがありますか?私のウィンドウのcontentViewにはsetWantsLayer:YESがあり、スライドインしているすべてのビューも同様です。

4

1 に答える 1

2

暗黙のアニメーションは、スタンドアロンレイヤー(ビューをバックアップしていないレイヤー)でのみ機能します。

レイヤーを明示的にアニメーション化する必要があります(デフォルトでは発生しないため、プロパティ値を変更します)。それは次のようになります

CABasicAnimation *slideIn = [CABasicAnimation animationWithKeyPath:@"position"];
[slideIn setToValue:[NSValue valueWithCGPoint:myNewEndPoint]];
[slideIn setFromValue:[NSValue valueWithCGPoint:[[slidingInView layer] position]]];
[[slidingInView layer] addAnimation:slideIn forKey:@"mySlideInAnimation"];
[[slidingInView layer] setPosition:myNewEndPoint];

また、アンカーポイントを変更していない限り、レイヤーの位置は中央にある必要があります(つまり、アンカーポイントを(0,0)に設定すると、レイヤーの3/4が画面外に表示されます。

于 2012-06-22T20:27:51.627 に答える