3 回答

TA貢獻1875條經(jīng)驗 獲得超3個贊
將動畫添加到圖層時,該動畫不會更改圖層的屬性。而是,系統(tǒng)創(chuàng)建該層的副本。原始層稱為模型層,副本層稱為表示層。表示層的屬性隨動畫的進行而變化,但是模型層的屬性保持不變。
刪除動畫時,系統(tǒng)將破壞表示層,僅保留模型層,然后模型層的屬性將控制該層的繪制方式。因此,如果模型層的屬性與表示層屬性的最終動畫值不匹配,則該層將立即重置為其在動畫之前的外觀。
要解決此問題,您需要將模型圖層的屬性設(shè)置為動畫的最終值,然后將動畫添加到圖層。您要按此順序進行操作,因為更改圖層屬性可以為該屬性添加隱式動畫,這將與您要顯式添加的動畫沖突。您要確保您的顯式動畫覆蓋隱式動畫。
那你怎么做這些呢?基本配方如下所示:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.fromValue = [NSValue valueWithCGPoint:myLayer.position];
layer.position = newPosition; // HERE I UPDATE THE MODEL LAYER'S PROPERTY
animation.toValue = [NSValue valueWithCGPoint:myLayer.position];
animation.duration = .5;
[myLayer addAnimation:animation forKey:animation.keyPath];
我沒有使用動畫組,所以我不完全知道您可能需要更改什么。我只是將每個動畫分別添加到圖層。
我還發(fā)現(xiàn)使用該+[CATransaction setCompletionBlock:]方法為一個或多個動畫設(shè)置完成處理程序比嘗試使用動畫的委托更容易。設(shè)置事務(wù)的完成塊,然后添加動畫:
[CATransaction begin]; {
[CATransaction setCompletionBlock:^{
[self.imageView removeFromSuperview];
}];
[self addPositionAnimation];
[self addScaleAnimation];
[self addOpacityAnimation];
} [CATransaction commit];

TA貢獻1812條經(jīng)驗 獲得超5個贊
完成后,會自動刪除CAAnimations。有一個屬性removedOnCompletion
對此進行控制。您應(yīng)該將其設(shè)置為NO
。
此外,還有一個名為的fillMode
控件,可以控制動畫持續(xù)時間之前和之后的行為。這是在上聲明的屬性CAMediaTiming
(CAAnimation
符合)。您應(yīng)該將此設(shè)置為kCAFillModeForwards
。
通過這兩個更改,動畫應(yīng)在完成后繼續(xù)存在。但是,我不知道您是否需要在組中或在組中的單個動畫上或同時在兩者上進行更改。
- 3 回答
- 0 關(guān)注
- 706 瀏覽
添加回答
舉報