2013-02-27 2 views
7

간단한 변환 기반 애니메이션을 수행 할 애니메이션 블록이 있습니다. 완료시 문제의 뷰가 수퍼 뷰에서 제거됩니다. 애니메이션을 일시 기술 Q &하여 1,673 http://developer.apple.com/library/ios/#qa/qa1673/_index.html 상세한로UIView 애니메이션 블록 애니메이션 및 완료 코드 모두 일시 중지

UIView *msgView = [[UIView alloc] initWithFrame:CGRectMake(160, 120, 160, 100)]; 

// Do stuff to set up the subviews of msgView. 

// Add the msgView to the superview (ViewController) that is going to display it. 

CATransform3D transform = CATransform3DMakeScale(2.5, 2.5, 1.0); 

[UIView animateWithDuration:5.0 
       animations:^(void){msgView.layer.transform = transform;} 
       completion:^(BOOL finished){[msgView removeFromSuperview];}]; 

I는 다음의 코드를 사용한다.

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

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

그러나이 코드는 완료 코드가 실행되는 것을 방해하지 않습니다. 그래서 이것에 완료 코드를 변경 실행에서 코드를 방지 할 :

completion:^(BOOL finished){if(finished == TRUE)[msgView removeFromSuperview];}; 

을 == 완료 마찬가지 검사 동안 애니메이션 블록이 일시 정지 동안 실행되는 종료 코드를 방지한다. 애니메이션을 "일시 중지 해제"하기 전에 지속 시간이 경과하면 완료 코드가 실행되지 않습니다. 즉,이 경우 msgView는 수퍼 뷰에 남아 있습니다.

완료 코드와 관련된 애니메이션과 타이머를 모두 일시 중지/일시 중지 해제 할 수 있습니까 (해당되는 경우).

+1

흥미로운 질문입니다. iOS에서 버그로 해석 될 수 있습니다. 이 문제를 해결하려면 애니메이션의 완성 부분을 없애고 현재 NSTimer를 작성한 다음 현재 완료가 호출되도록 제안하십시오. 이렇게하면 일시 중지 계층에서 타이머를 중지 할 수 있습니다 (나중에 fireDate를 설정하여). 내부 resumeLayer는 fireDate가 (timeSincePause + 5.0) – Rikkles

+0

이되도록 재설정했습니다. 우리가 레이어와 같은 방식으로 완료 코드와 연관된 CAMediaTiming에 직접 가길 바랬습니다. 나는 이것이 훨씬 더 나은 해결책이라고 생각한다. – VariableSquid

+0

iOS 6.1에서 테스트 앱을 작성했으며 올바르게 작동합니다. 즉, 변환 타이머가 일시 중지되었습니다. 어떤 OS에서 테스트하고 있습니까? – Rikkles

답변

5

위의 의견에서 말한 것처럼 문제가없는 것 같습니다. 아래는 iOS 5.1 및 6.1에서 테스트되었습니다.

UIImageView *transViewUIButton *trigger으로 스토리 보드를 만듭니다. 여기에 클래스가있다 :

TSTViewController.h :

@property (weak, nonatomic) IBOutlet UIImageView *transView; 
@property (weak, nonatomic) IBOutlet UIButton *trigger; 
@property (nonatomic) NSUInteger bState; 

- (IBAction)didPressTrigger:(id)sender; 

TSTViewController.m :

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.bState = 0; // 0 is initial state 
         // 1 is transform being animated 
         // 2 is transform paused 
         // 3 is transform ended 
} 

- (IBAction)didPressTrigger:(id)sender { 
    switch (self.bState) { 
     case 0: 
     { 
      CATransform3D transform = CATransform3DMakeScale(2.5, 2.5, 1.0); 
      self.bState++; 
      [UIView animateWithDuration:5.0 
          animations:^(void){self.transView.layer.transform = transform;} 
          completion:^(BOOL finished){ 
           self.bState = 3; 
           NSLog(@"Done"); 
          }]; 
      break; 
     } 
     case 1: 
     { 
      self.bState++; 
      [self pauseLayer:self.transView.layer]; 
      break; 
     } 
     case 2: 
     { 
      self.bState = 1; 
      [self resumeLayer:self.transView.layer]; 
      break; 
     } 
     case 3: 
     { 
      [UIView animateWithDuration:0 animations:^(void){self.transView.layer.transform = CATransform3DIdentity;} 
          completion:^(BOOL finished) { 
           self.bState = 0; 
           NSLog(@"Reset"); 
          }]; 
      break; 
     } 
     default: 
      break; 
    } 
} 

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

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

당신이 트리거 버튼을 누르면

, 애니메이션이 시작됩니다. 다시 누르면 애니메이션이 중지됩니다. 10 초 동안 기다렸다가 버튼을 다시 누릅니다. 애니메이션이 계속되고 끝나고 "완료"가 기록됩니다.

관련 문제