애니메이션을 사용하여 한 뷰를 창에서 슬라이딩시키고 다른 뷰를 동시에 슬라이딩 시키려고합니다. 좋아요 :암시 적 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가 있습니다. 예를 들어 슬라이딩 할 모든 뷰가 있습니다.
훌륭합니다! 의사가 주문한 것입니다. 암시 적 애니메이션의 단순함이 정말 마음에 들었지만, 작동합니다.) 그런데 valueWithCGPoint는 Mac에서 정의되지 않았으므로 NSPoint를 사용하는 valueWithPoint를 사용하기 때문에 캐스트가 필요합니다. 이것은 추한 것입니다. 어쨌든, 고마워! –
아, 나는 iOS에 너무 익숙해 NSValue와의 차이점을 잊어 버렸습니다. –