2012-06-22 4 views
0

애니메이션을 사용하여 한 뷰를 창에서 슬라이딩시키고 다른 뷰를 동시에 슬라이딩 시키려고합니다. 좋아요 :암시 적 CALayer 애니메이션이 애니메이션을 적용하지 않습니다.

 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가 있습니다. 예를 들어 슬라이딩 할 모든 뷰가 있습니다.

답변

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의 레이어가 화면에 나타나지 않습니다.

+0

훌륭합니다! 의사가 주문한 것입니다. 암시 적 애니메이션의 단순함이 정말 마음에 들었지만, 작동합니다.) 그런데 valueWithCGPoint는 Mac에서 정의되지 않았으므로 NSPoint를 사용하는 valueWithPoint를 사용하기 때문에 캐스트가 필요합니다. 이것은 추한 것입니다. 어쨌든, 고마워! –

+0

아, 나는 iOS에 너무 익숙해 NSValue와의 차이점을 잊어 버렸습니다. –

관련 문제