2012-03-21 5 views
0

사용자가 마음대로 애니메이션을 취소 할 수 있도록 UIViewAnimationOptionBeginFromCurrentState를 사용하여 다단계 애니메이션을 구현하려고합니다. 애니메이션은 두 가지 크기 사이에서 주기적으로 주기적으로 움직이는 뷰입니다. 사용자가 애니메이션을 취소하기 위해 뷰를 터치하면 뷰가 원래 크기의 작은 크기로 빠르게 되돌아 가도록합니다.UIViewAnimationOptionBeginFromCurrentState에서의 예상치 못한 동작

두 개의 별도 애니메이션을 사용하여 멀티 스테이지 측면을 구현했습니다. 하나는 뷰를 확장하고 하나는 축소하는 것입니다. 각각 완료 블록에서 다른 루틴을 호출하므로 중단 플래그가 설정되어 있지 않으면 영원히 순환됩니다.

성장보기 애니메이션 중에 중단이 호출되면 예상되는 동작을 얻습니다. 애니메이션이 신속하고 즉시 원래의 작은 크기로보기를 반환하고 멈 춥니 다. 좋은!

그러나 축소보기 애니메이션주기 중에 호출이 중단되면 UIViewAnimationOptionBeginFromCurrentState 옵션이 호출되지 않은 것처럼보기가 동일한 속도로 축소 된 다음 예상대로 멈 춥니 다.

코드를 사용하면이 사실을 분명히 알 수 있으며 희망을 갖고 누군가는 내가 할 수없는 것을 볼 수 있습니다.

- (void)stopAnimating { 
    abort = YES; 

    [UIView animateWithDuration:.2 // some small interval 
          delay:0 
         options:UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ self.frame = minRect;} 
        completion:^(BOOL done){} 
    ]; 
} 

- (void)animateSmall { 
    [UIView animateWithDuration:4 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:^{self.frame = minRect;} 
        completion:^(BOOL done){if (!abort)[self animateBig];} 
    ]; 
} 

- (void)animateBig { 
    [UIView animateWithDuration:4 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction 

        animations:^{self.frame = maxRect;} 
        completion:^(BOOL done){if (!abort)[self animateSmall];} 
    ]; 
} 

답변

1

여러분의 코드가 내가했던 것처럼 정확하게 보이기 때문에 여기에 맞춰보십시오. 하지만 계속 진행되는 것은 중단 애니메이션이 중단되는 애니메이션과 동일한 값으로 동일한 속성을 설정한다는 것입니다.이 변경 사항은 변경 사항이 적용되지 않아도 변경되지 않아도 동일하게 처리됩니다.

이 이론을 테스트하여 문제를 해결하면 진동 minRect가 정상 상태 minRect와 크기면에서 조금 달라집니다.

희망 사항. 행운을 빕니다.

+0

나는 그것이 있다고 생각합니다. 여전히, 하나의 작은 퍼즐. 명시 적 CGRect newMinRect = CGRectMake (...)를 사용하여 최종 크기를 약간 변경하면 코드가 축소 단계에서 적절한 작업을 수행합니다. 그러나 minRect를 정확히 동일한 값으로 CGRectOffset (minRect, ...)을 사용하여 변경하면 직사각형이 축소 되어도 예기치 않은 동작이 발생합니다. 직사각형의 원점은 예상되는 최종 x 위치에서 끝내기 전에 중단을 호출하기 전까지 기다리는 시간에 따라 이동 중에 예상되는 위치의 왼쪽 또는 오른쪽으로 이동합니다. 매우 이상합니다. – hkatz

+0

시각화하기가 어렵지만 다음과 같이 오프셋이 아닌 인세 트를 찾고 있다고 생각합니다. self.frame = UIEdgeInsetsInsetRect (self.frame, UIEdgeInsetsMake (1, 1, 1, 1)); – danh

+0

그래도 여전히 이상하게 보일 수 있습니다. 다시 한 번 직감으로, 최종 상태 rect가 아니라 진동하는 최소 직사각형에 그 삽입 트릭을 시도하면 어떨까요? (물론 애니메이션 루프 외부에 반복해서 삽입하지 마십시오). – danh