2013-01-21 3 views
3

사용자가 작업을 수행 할 때 표시 할 레이어가 있으며 작업을 완료 한 후에 숨길 수 있습니다. 사용자가 작업을 다시 수행하면 레이어가 다시 표시됩니다. 애니메이션에 미쳐 갈 수있는 UI 위해서는재생하는 동안 취소 및/또는 되돌릴 수있는 지연된 CAAnimation을 만드는 방법은 무엇입니까?

, 내가 원하는 : 페이드 아웃 애니메이션은 하나의 초 후에 시작 (그리고 사용자가 시작되기 전에 조치를 않는 경우 취소)

  • 것을
  • 층이

이 작업을 수행하는 가장 좋은 방법은 무엇입니까 사라되기 전에 사용자가 작업을하는 경우 레이어를 표시 할 수있는 fadein 애니메이션이 현재 페이드 아웃 불투명도에서 시작?

나는이 시도, 그러나 이것은 (레이어 깜박임과 소음이 많은)가 제대로 작동하지 않습니다

- (void)hideHintLayer:(bool)hide 
{ 
    if(hide) 
    { 
    CABasicAnimation *animation = [CABasicAnimation animation]; 
    animation.beginTime = CACurrentMediaTime() + 1.0f; 
    animation.duration = 1.0f; 
    animation.fillMode = kCAFillModeForwards; 
    animation.removedOnCompletion = NO; 
    animation.keyPath = @"opacity"; 
    animation.fromValue = @(1.0f); 
    animation.toValue = @(0.0f); 
    [layer addAnimation:animation forKey:nil]; 
    } 
    else 
    { 
    layer.opacity = 1.0f; 
    } 
} 
+0

ios의 버전은 무엇입니까? – tiguero

+0

iOS6을 사용합니다. iOS5와는 다른 점이 있습니까? – oulipo

+0

아니요 - 나는 UIView에서 블록 기반 애니메이션을 사용하여 UI를 권장 할 생각 이었지만 레이어에서 작동하지 않습니다. – tiguero

답변

2

당신이 애니메이션을 중지하려면, 당신은 그냥 할 수있는

[layer removeAllAnimations]; 

애니메이션 숨기기 중에 현재 alpha을 알고 싶다면 (애니메이션을 뒤집을 수 있도록 올바른 위치에서 다음을 수행 할 수 있습니다.

CALayer *presentationLayer = layer.presentationLayer; 
CGFloat startingAlpha = presentationLayer.opacity; 

그런 다음 startingAlpha에서 1.0으로 이동하도록 설정하여 화면을 깜박이지 않고 숨기기 해제를 애니메이션으로 만들 수 있습니다.

블록 기반 애니메이션을 사용하여 실제 애니메이션을 만들 수 있습니다. 그렇지 않은 경우 CABasicAnimation을 사용할 수 있다고 생각합니다.


따라서, 예를 들어, 다음 (내 예에서, 내가 가지고 "쇼"버튼)과 같은 일을 할 수 있습니다. 나는 블록 애니메이션을 사용하여,하지만 난 너무, 그것은 CABasicAnimation을 위해 잘 작동 것입니다 의심 :

- (void)reverseAndPauseHide 
{ 
    // if we have a "hide" scheduled, then cancel that 

    if (self.timer) 
    { 
     [self.timer invalidate]; 
     self.timer = nil; 
    } 

    // if we have a hide in progress, then reverse it 

    if (self.hiding) 
    { 
     [self.containerView.layer removeAllAnimations]; 

     CALayer *layer = self.containerView.layer.presentationLayer; 
     CGFloat currentAlpha = layer.opacity; 

     self.containerView.alpha = currentAlpha; 

     [self show]; 
    } 
} 

:

- (IBAction)onPressShowButton:(id)sender 
{ 
    [self showAndScheduleHide]; 
} 

- (void)showAndScheduleHide 
{ 
    [UIView animateWithDuration:1.0 
        animations:^{ 
         self.containerView.alpha = 1.0; 
        } 
        completion:^(BOOL finished) { 
         [self scheduleHide]; 
        }]; 
} 

- (void)show 
{ 
    [UIView animateWithDuration:1.0 
        animations:^{ 
         self.containerView.alpha = 1.0; 
        } 
        completion:nil]; 
} 

- (void)scheduleHide 
{ 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:5.0 
                target:self 
               selector:@selector(startToHide) 
               userInfo:nil 
               repeats:NO]; 
} 

- (void)startToHide 
{ 
    self.timer = nil; 

    self.hiding = YES; 

    [UIView animateWithDuration:5.0 
          delay:0.0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         self.containerView.alpha = 0.0; 
        } 
        completion:^(BOOL finished) { 
         self.hiding = NO; 
        }]; 
} 

당신은 다음을 반전하거나 진행중인 숨기기 일정을 변경하기위한 몇 가지 유틸리티 메소드를 가질 수 있습니다 그런 다음 질문은 당신이 이것을 reverseAndPauseHide이라고 부르고 언제 scheduleHide으로 다시 전화 할 것인지를 아는 것입니다. 따라서 예를 들어 터치를 처리 할 수 ​​있습니다 :

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 

    [self reverseAndPauseHide]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesEnded:touches withEvent:event]; 

    [self scheduleHide]; 
}