사용자가 마음대로 애니메이션을 취소 할 수 있도록 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];}
];
}
나는 그것이 있다고 생각합니다. 여전히, 하나의 작은 퍼즐. 명시 적 CGRect newMinRect = CGRectMake (...)를 사용하여 최종 크기를 약간 변경하면 코드가 축소 단계에서 적절한 작업을 수행합니다. 그러나 minRect를 정확히 동일한 값으로 CGRectOffset (minRect, ...)을 사용하여 변경하면 직사각형이 축소 되어도 예기치 않은 동작이 발생합니다. 직사각형의 원점은 예상되는 최종 x 위치에서 끝내기 전에 중단을 호출하기 전까지 기다리는 시간에 따라 이동 중에 예상되는 위치의 왼쪽 또는 오른쪽으로 이동합니다. 매우 이상합니다. – hkatz
시각화하기가 어렵지만 다음과 같이 오프셋이 아닌 인세 트를 찾고 있다고 생각합니다. self.frame = UIEdgeInsetsInsetRect (self.frame, UIEdgeInsetsMake (1, 1, 1, 1)); – danh
그래도 여전히 이상하게 보일 수 있습니다. 다시 한 번 직감으로, 최종 상태 rect가 아니라 진동하는 최소 직사각형에 그 삽입 트릭을 시도하면 어떨까요? (물론 애니메이션 루프 외부에 반복해서 삽입하지 마십시오). – danh