[ios] 取消UIView動畫?



Answers

使用:

#import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];
Question

是否有可能在進行中取消UIView動畫? 或者我必須下降到CA級別?

即我做了這樣的事情(也許設置一個結束動畫行動):

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

// set view properties

[UIView commitAnimations];

但在動畫完成之前,我收到動畫結束事件,我想取消它(縮短)。 這可能嗎? 谷歌搜索發現有幾個人問同樣的問題沒有答案 - 一兩個人猜測這是不可能完成的。




如果您通過更改常量而不是視圖屬性來激活約束,則其他方法都不會在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];
}



在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 setAnimationsEnabled:NO];
// your code here
[UIView setAnimationsEnabled:YES];



即使您以上述方式取消動畫didStopSelector仍然運行。 所以如果你的應用程序由動畫驅動的邏輯狀態,你將會遇到問題。 由於這個原因,我使用上面描述的方法使用UIView動畫的上下文變量。 如果您將程序的當前狀態通過上下文參數傳遞給動畫,則當動畫停止時, didStopSelector函數可以決定它是應該執行某些操作還是僅基於當前狀態和作為上下文傳遞的狀態值進行返回。




要暫停動畫而不將狀態恢復為原始或最終狀態:

CFTimeInterval paused_time = [myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
myView.layer.speed = 0.0;
myView.layer.timeOffset = paused_time;








Links