2010-07-09 3 views
4

나는 위에서 아래로 또는 그 반대로 움직이는 여러 UILabels가있는 UIView를 가지고 있습니다. 마지막에 다른 함수를 호출 정의 된 AnimationDidStopSelectorUIView 애니메이션을 일시 중지했다가 다시 시작하는 방법은 무엇입니까?

-(void)goUp 
-(void)goDown 

그 기능이 필요한 position.They 모두에 UIView의 애니메이션을 시작합니다 Autoque의 종류의 난이 개 기능을 사용 : 가정 해 봅시다. 이것은 모두 원활하게 작동합니다.

touchesBegan을 사용하여 화면을 터치 할 때 touchesMoved 이벤트를 사용하여 현재 애니메이션을 일시 중지하고 UIView의 수직 위치를 변경하고 싶습니다. touchesEnded에서 필요한 끝 위치로 애니메이션을 다시 시작하겠습니다.

이렇게하는 적절한 방법은 무엇입니까?

토마스

+0

http://stackoverflow.com/questions/9104487/how-to-pause-and-resume-uiview-animation- without-block-animation은 내가 일하는 것이 가장 좋았던 방법입니다. –

답변

1

는 나는있는 UIView의 직접 가능합니다 있는지 확실하지 않습니다하지만 당신은 확실히 대신 뷰의 CALayers 애니메이션 것을 할 수 있습니다. CAAnimations 일시 중지 및 다시 시작에 대한 내용은 this question을 참조하십시오.

2

블라디미르, CAAnimations에 대한 질문이 이해가 ...하지만 난 '일시 정지'내가 애니메이션을 UIView의 계속 사용 할 수있는 방법을 발견 :

CALayer *pLayer = [self.containerView.layer presentationLayer]; 
CGRect frameStop = pLayer.frame; 
pausedX = frameStop.origin.x; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationDuration:0.01]; 
[UIView setAnimationCurve: UIViewAnimationCurveLinear];  
// set view properties 

frameStop.origin.x = pausedX; 
self.containerView.frame = frameStop; 
[UIView commitAnimations]; 

내가 여기서 뭘하고있어 표현 계층을 사용하여 찾을 수를 애니메이션보기의 현재 x 값을 출력합니다. 그런 다음 원본 애니메이션을 덮어 쓰는 새 애니메이션을 실행합니다. 이 경우 SetAnimationBeginsFromCurrentstate : YES를 설정해야합니다. 이렇게하면 원본 애니메이션이 취소되고 애니메이션보기가 대상 위치 (자동으로 수행됨)가 아니라 애니메이션 처리의 현재 위치에 놓입니다.

희망 사항은 다른 사용자에게도 도움이되기를 바랍니다. :) 사실

+0

정확하게 정지 된 것은 무엇입니까? 나는 그것을 int로 설정했다. –

+0

pausedX를 int로 정의하면 자동으로 CGFloat로 변환됩니다. frameStop은 CGRect이며, CGSize와 CGPoint로 구성된 구조체입니다. 원점은 두 개의 CGFloat로 구성된 구조체입니다. – willc2

+0

프레임이 아닌 변형을 애니메이션으로 적용하는 경우 어떻게이 작업을 수행 할 수 있습니까? – zakdances

4

, 당신은 여전히 ​​블라디미르 내가 CABasicaAnimations으로 내 모든 애니메이션을 구현 한 후 내 CABasicAnimations뿐만 아니라 내 UIView 애니메이션을 일시 정지로 연결 한 후 몇 가지를 추가 그 질문에 대한 대답에 따라 UIView 애니메이션을 일시 정지 할 수 있습니다 나중에 내가 생각했던 애니메이션은 일시 중지되지 않았지만 작동하지 않았습니다. This is the relevant link.

일시 중지하려는 레이어로 self.view.layer을 넘겼으므로 전체 화면을 일시 중지하고 싶습니다. 그러나 CALayer을 모르시는 분은 일시 중지하려는 view.layer을 전달하십시오. UIView에는 CALayer이 있으므로 가장 가까운 view.layer을 전달하면됩니다. 토마스의 경우 자신의 대답에 따라 self.containerView.layer을 전달하여 일시 중지하는 것이 좋습니다.

UIView 애니메이션은 단순히 코어 애니메이션의 맨 위에있는 레이어이기 때문에 작동하는 이유입니다. 적어도 그것은 나의 이해입니다.

희망은 미래의 사람들이 애니메이션을 일시 중지하는 방법을 궁금해 할 것입니다.

0

희망이 있으면 도움이 될 것입니다.

- (void)goUP{ 
    CFTimeInterval pausedTime = [self.layer timeOffset]; 
    self.layer.speed = 1.0; 
    self.layer.timeOffset = 0.0; 
    self.layer.beginTime = 0.0; 
    CFTimeInterval timeSincePause = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; 
    self.layer.beginTime = timeSincePause; 
} 

- (void)goDown{ 
    CFTimeInterval pausedTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
    self.layer.speed = 0.0; 
    self.layer.timeOffset = pausedTime; 
} 

레이어 애니메이트를 호출하면 모든 레이어 트리와 서브 모드 레이어에 애니메이션이 적용됩니다.

7

나는 애니메이션을 일시 정지 할 수있는 UIView에 카테고리를 만들었습니다

@interface UIView (AnimationsHandler) 

- (void)pauseAnimations; 
- (void)resumeAnimations; 

@end 

@implementation UIView (AnimationsHandler) 
- (void)pauseAnimations 
{ 
    CFTimeInterval paused_time = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
    self.layer.speed = 0.0; 
    self.layer.timeOffset = paused_time; 
} 

- (void)resumeAnimations 
{ 
    CFTimeInterval paused_time = [self.layer timeOffset]; 
    self.layer.speed = 1.0f; 
    self.layer.timeOffset = 0.0f; 
    self.layer.beginTime = 0.0f; 
    CFTimeInterval time_since_pause = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - paused_time; 
    self.layer.beginTime = time_since_pause; 
} 
+0

은 resumeAnimations를 체크인하여 paused_time == 0으로 설정하여 –

+0

전에 일시 중지했는지 확인하는 것이 좋습니다.이 방법은 UIPercentDrivenInteractiveTransition에서 제대로 작동하지 않는 것 같습니다. – Johan

관련 문제