CoreAnimation注意事項

2022-07-12 07:30:12 字數 1659 閱讀 5543

最近調查的乙個bug和記憶體洩露都和coreanimation有關,因此談一下使用coreanimation需要注意的幾個問題

caanimation的delegate屬性是retain的,這個設計確實比較坑人,完全違背了「一致性」原則,產品裡面的有個記憶體洩露就和這個有關。

calayer的addanimation:forkey方法會對第乙個引數,也即animation物件進行copy;這種設計的乙個結果是,如果你同時新增了多個animation,在caanimation的delegate方法animationdidstop:finished裡面無法通過比較引用來區分animation;要想達到區分的目的,只能通過[caanimation setvalue:forkey]設定乙個屬性,比如id,然後在delegate方法裡面去比較這個屬性值。

盡量不要將caanimation的removedoncompletion設定為no,否則的話,很容易發生記憶體洩露;參考第1點,常見的場景是有乙個view,裡面建立了乙個caanimation新增給了自身,caanimation的delegate設成了view自身,至此乙個迴圈引用形成

caanimation *animation = ...

animation.delegate = self;

animation.removeoncomplete=no;

[self.layer addanimation:animation];

4. 很多人之所以將removedoncompletion設定成為yes,是為了在caanimation結束之後,calayer不要回退到動畫前的狀態,這個正確的解決方案是這樣的,在動畫開始之前將layer的相關屬性設定為目標值

```cabasicanimation *animation = [cabasicanimation animationwithproperty:@property];

animation.fromvalue = @fvalue;

animation.tovalue = @tvalue;

[layer addanimation:animation forkey:@key];

layer.property = tvalue //設定layout的屬性值為目標值

要理解上面這個方案之所以是正確的,必須要稍微了解一下calayer動畫的原理,每個calayer有乙個對應的present layer用來做動畫,此時自身可以叫做model layer,顧名思義,model layer是用來儲存相對穩定的屬性的,而present layer使用來臨時渲染動畫效果的。

在動畫執行的過程中,螢幕上顯示的是present layer而不是model layer,animation物件對屬性值進行插值處理的目標也是present layer,當動畫結束後,model layer又顯示出來了。

理解了這一點,很多caanimation的現象就不難理解了,removedoncompletion屬性設定為yes,看起來確實可以使layer保持動畫的結束狀態,因為顯示的一直就是present layer。而動畫開始之前,將layer的屬性設定為目標屬性,也不會和動畫相互產生作用,因為動畫根本不會去修改layer的屬性。

objc.io最近推出乙個animation主題,相當給力。

Core Animation動畫概述

core animation動畫概述 1 概述 在ios中,圖形可分為以下幾個層次 越上層,封裝程度越高,動畫實現越簡潔越簡單,但是自由度越低。本文著重介紹core animation層的動畫實現方案。2 動畫概念類 在ios中,展示動畫可以模擬於顯示生活中的 拍電影 拍電影有三大要素 演員 劇本 ...

IOS動畫Core Animation詳解

在ios中如果使用普通的動畫則可以使用uikit提供的動畫方式來實現,如果想實現更複雜的效果,則需要使用core animation了。下面詳解各種型別動畫的使用方式 plain view plain copy void animationofuikit plain view plain copy ...

IOS動畫Core Animation詳解

在ios中如果使用普通的動畫則可以使用uikit提供的動畫方式來實現,如果想實現更複雜的效果,則需要使用core animation了。下面詳解各種型別動畫的使用方式 plain view plain copy void animationofuikit plain view plain copy ...