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];
}