[ios] UIView 애니메이션을 취소 하시겠습니까?

UIView진행중인 애니메이션 을 취소 할 수 있습니까? 아니면 CA 수준으로 떨어 뜨려야합니까?

즉, 다음과 같은 작업을 수행했습니다 (아마도 애니메이션 동작을 설정했을 수도 있음).

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

그러나 애니메이션이 완료되고 애니메이션 종료 이벤트를 받기 전에 취소하고 싶습니다 (짧게 잘라 내고 싶습니다). 이게 가능해? 인터넷 검색을 통해 몇 사람이 대답없이 동일한 질문을하고 한 명 또는 두 명이 할 수 없다고 추측합니다.



답변

내가하는 방법은 끝점에 새 애니메이션을 만드는 것입니다. 매우 짧은 지속 시간을 설정 +setAnimationBeginsFromCurrentState:하고 현재 상태에서 시작 하는 방법을 사용하십시오 . YES로 설정하면 현재 애니메이션이 짧아집니다. 다음과 같이 보입니다.

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.1];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];


답변

사용하다:

#import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];


답변

특정 뷰에서 모든 애니메이션을 즉시 중지 하는 가장 간단한 방법 은 다음과 같습니다.

프로젝트를 QuartzCore.framework에 연결하십시오. 코드 시작시 :

#import <QuartzCore/QuartzCore.h>

이제 트랙에서 죽은 뷰의 모든 애니메이션을 중지하려면 다음과 같이 말합니다.

[CATransaction begin];
[theView.layer removeAllAnimations];
[CATransaction commit];

중간 라인은 모두 작동하지만 runloop가 완료 될 때까지 지연됩니다 ( “redraw moment”). 지연을 방지하려면 표시된대로 명시 적 트랜잭션 블록에 명령을 래핑하십시오. 현재 runloop에서이 계층에 대해 다른 변경이 수행되지 않은 경우 작동합니다.


답변

iOS 4 이상에서는 두 번째 애니메이션 UIViewAnimationOptionBeginFromCurrentState옵션사용 하여 첫 번째 애니메이션을 짧게 자릅니다.

예를 들어, 활동 표시기가있는보기가 있다고 가정하십시오. 시간이 많이 걸리는 활동이 시작되는 동안 활동 표시기를 페이드하고 활동이 완료되면 페이드 아웃합니다. 아래 코드에서 활동 표시기가있는보기를 호출 activityView합니다.

- (void)showActivityIndicator {
    activityView.alpha = 0.0;
    activityView.hidden = NO;
    [UIView animateWithDuration:0.5
                 animations:^(void) {
                     activityView.alpha = 1.0;
                 }];

- (void)hideActivityIndicator {
    [UIView animateWithDuration:0.5
                 delay:0 options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^(void) {
                     activityView.alpha = 0.0;
                 }
                 completion:^(BOOL completed) {
                     if (completed) {
                         activityView.hidden = YES;
                     }
                 }];
}


답변

애니메이션을 취소하려면 UIView 애니메이션 외부에서 현재 애니메이션중인 속성을 설정하기 만하면됩니다. 그러면 애니메이션이 어디에 있든 중지되고 UIView가 방금 정의한 설정으로 이동합니다.


답변

이 답변을 부활시켜 죄송하지만 iOS 10에서는 약간 변경되었으며 이제 취소가 가능하며 정상적으로 취소 할 수도 있습니다!

iOS 10 이후에는 UIViewPropertyAnimator로 애니메이션을 취소 할 수 있습니다 !

UIViewPropertyAnimator(duration: 2, dampingRatio: 0.4, animations: {
    view.backgroundColor = .blue
})
animator.stopAnimation(true)

true를 전달하면 애니메이션이 취소되고 취소 한 위치에서 바로 중지됩니다. 완료 메소드는 호출되지 않습니다. 그러나 false를 전달하면 애니메이션을 완료해야합니다.

animator.finishAnimation(.start)

애니메이션을 끝내고 현재 상태 (.current)를 유지하거나 초기 상태 (.start) 또는 종료 상태 (.end)로 이동할 수 있습니다.

그건 그렇고, 나중에 일시 중지했다가 다시 시작할 수도 있습니다 …

animator.pauseAnimation()
animator.startAnimation()

참고 : 갑작스러운 취소를 원하지 않으면 애니메이션을 일시 중지 한 후 애니메이션을 반전 시키거나 변경할 수도 있습니다!


답변

view 속성 대신 상수를 변경하여 제약 조건에 애니메이션을 적용하는 경우 다른 방법은 iOS 8에서 작동하지 않습니다.

애니메이션 예 :

self.constraint.constant = 0;
[self.view updateConstraintsIfNeeded];
[self.view layoutIfNeeded];
[UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     self.constraint.constant = 1.0f;
                     [self.view layoutIfNeeded];
                 } completion:^(BOOL finished) {

                 }];

해결책:

구속 조건 변경 및 해당 하위 레이어의 영향을받는 뷰의 레이어에서 애니메이션을 제거해야합니다.

[self.constraintView.layer removeAllAnimations];
for (CALayer *l in self.constraintView.layer.sublayers)
{
    [l removeAllAnimations];
}