iOS動畫--核心動畫

使用核心動畫不會給cpu造成負擔,也不會拖慢app運行速度,更不會阻塞主線程。大部分工作都是由專門的圖形硬件來渲染的。
該組件的核心是layer對象,核心動畫大部分都是需要操作layer對象的屬性來完成的。
核心動畫幾個類的繼承結構如圖:


structure.png

CAAnimation 核心動畫的基類

核心動畫的抽象類,繼承自NSObject
CAAnimation提供遵守了CAMediaTiming和CAAction協議(同時還有NSSecureCoding和NSCopying)。使用時不會直接創(chuàng)建CAAnimation,一般都使用其子類CABasicAnimation,CAKeyframeAnimation,CAAnimationGroup,CATransition

來看看它的一些方法和屬性:
+(instancetype)animation : 創(chuàng)建一個動畫對象
delegate: 動畫代理,類型是CAAnimationDelegate,動畫開始和停止時會調用里面的代理方法
removeOnCompletion:默認為YES,動畫結束時將動畫移除。
timingFunction 表示動畫執(zhí)行的速度,默認是nil,表示勻速,其值有以下幾個:

  1. kCAMediaTimingFunctionLinear 勻速
  2. kCAMediaTimingFunctionEaseIn 慢進
  3. kCAMediaTimingFunctionEaseOut慢出
  4. kCAMediaTimingFunctionEaseInEaseOut慢進慢出
  5. kCAMediaTimingFunctionDefault
    另外,CAMediaTimingFunction提供了幾個方法來自定義速度,這兒不說啦***
CAAnimationDelegate

Methods your app can implement to respond when animation start and stop.
提供了一些方法實現,當動畫開始或停止時給出響應
該代理只提供了兩個方法:

- (void)animationDidStart:(CAAnimation *)anim;// 動畫開始時被調用
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;//動畫結束時或動畫被移除時都會調用,只有當動畫正常完成時flag的值才為true
CAPropertyAnimation

繼承自CAAnimation,是一個抽象類,是操作layer的property來實現動畫的類。
使用動畫的keypath指定與動畫相關的property。
使用時不直接創(chuàng)建該類的實例,而是使用其子類CABasicAnimation 或 CAKeyframeAnimation
它的屬性和方法:
+(instancetype)animationWithKeyPath:(nullable NSString *)path;創(chuàng)建設置了path的動畫對象
@property(getter=isAdditive) BOOL additive;動畫是否以當前動畫效果為基礎,默認為NO(表示再次執(zhí)行動畫時,會先回到最初狀態(tài)再開始執(zhí)行)
@property(getter=isCumulative) BOOL cumulative;動畫效果是否累加,默認為NO
@property(nullable, strong) CAValueFunction *valueFunction;該屬性可以提供view翻轉或縮放的動畫效果,默認為nil
@property(nullable, copy) NSString *keyPath;:表示可以進行動畫的屬性(從官方文檔這里可以查到

1. CABasicAnimation 基礎動畫

You create an instance of CABasicAnimation using the inherited animationWithKeyPath: method, specifying the key path of the property to be animated in the render tree.

使用animationWithKeyPath:方法創(chuàng)建CABasicAnimation的實例,需要指定具體的keyPath來決定哪個屬性來實現動畫效果。
CABasicAnimation只新增了三個屬性:
fromValue、toValue、byValue,這三個屬性的使用也是real interesting:

  • 如果fromValuetoValue同時都不為nil,動畫效果是從fromValue變化到toValue
  • fromValuebyValue不為nil,動畫效果是從fromValuefromValue+byValue
  • byValuetoValue不為nil,動畫效果從fromValue-byValuetoValue
  • 只有fromValue不為nil,動畫效果從fromValue到當前狀態(tài)
  • 只有toValue不為nil,動畫效果從當狀態(tài)變化到toValue
  • 只有byValue不為nil,動畫效果從當前值變化到當前值+byValue
1.1 CASpringAnimation彈性動畫

繼承自CABasicAnimation
彈性動畫的幾個屬性(iOS9以后可用):
@property CGFloat mass;:附著在彈簧末端的質量,必須是大于0的數值,默認為1
@property CGFloat stiffness;:彈簧的硬度,值越大彈簧產生的力度越大。值必須大于0,默認是100
@property CGFloat damping;:阻力系數,值越大彈簧就越快停止。值必須大于等于0,默認值為10
@property CGFloat initialVelocity;:彈簧的初始速率,默認值是0,表示該物品沒有被移動。如果該值為正,速度方向和運動方向一致,如果為負,速度方向和運動方向相反
@property(readonly) CFTimeInterval settlingDuration;:結算時間,是只讀參數,根據當前設置的參數估算的動畫時長

CASpringAnimation動畫比較好玩,可惜只能iOS9+才能使用,小于該版本的只能自定義了
如圖是用springAnimation作的效果:


springAnimation.gif

代碼:

CASpringAnimation *springAnim = [CASpringAnimation animationWithKeyPath:@"position.y"];
    springAnim.initialVelocity = 3;
    springAnim.stiffness = 110;
    springAnim.mass = 1;
    springAnim.damping = 5;
    springAnim.fromValue = @(self.basicView.y);
    springAnim.toValue = @(self.basicView.y + 150);
    springAnim.duration = springAnim.settlingDuration;
    springAnim.removedOnCompletion = NO;
    springAnim.fillMode = kCAFillModeForwards;
    [self.basicView.layer addAnimation:springAnim forKey:@"springAnimation"];
2. CAKeyframAnimation 關鍵幀動畫

繼承自CAPropertyAnimation
屬性:
@property(nullable, copy) NSArray *values;:存放每個關鍵幀的數組
@property(nullable) CGPathRef path;:關鍵幀路徑,當它是非空時,會覆蓋values。默認是nil
@property(nullable, copy) NSArray<NSNumber *> *keyTimes;:該數組定義了和values對應的每一幀的時間,每個值的取值范圍是[0,1],如果不設置表示每一幀的時間都相同
@property(nullable, copy) NSArray<CAMediaTimingFunction *> *timingFunctions;:時間曲線函數,如果values中定義了n個關鍵幀對象,則該屬性內應定義n-1個對應的對象
@property(copy) NSString *calculationMode;:顧名思義啦,就是計算模式,列舉如下:
kCAAnimationLinear:各關鍵幀坐標點直線連接,是默認值
kCAAnimationDiscrete:分離式的,沒有補間動畫
kCAAnimationPaced:平均,如果使用此值,則keyTimetimeFunction被忽略
kCAAnimationCubic:對關鍵幀的坐標點進行圓滑曲線連接后插值計算
kCAAnimationCubicPaced:在kCAAnimationCubic的基礎上使動畫變得均勻,同樣地,使用該值之后,keyTimetimeFunction會被忽略

@property(nullable, copy) NSArray<NSNumber *> *tensionValues;
@property(nullable, copy) NSArray<NSNumber *> *continuityValues;
@property(nullable, copy) NSArray<NSNumber *> *biasValues;

對于計算模式是立方模式(cubic)的,這些屬性可以提供對插值方案的控制。每個關鍵幀都可能有與之關聯的張力(tensionValues)、連續(xù)性(continuityValues)和偏差值(biasValues),這幾個屬性的取值范圍是[-1,1]
@property(nullable, copy) NSString *rotationMode;:旋轉模式,可取的值為:
kCAAnimationRotateAuto:自動旋轉
kCAAnimationRotateAutoReverse:自動翻轉

CATransitionAnimation 轉場動畫

繼承自CAAnimation
慣例看一下它的屬性:

@property(copy) NSString *type;:轉場的名稱,默認是fade,以下是可用值:
kCATransitionFade
kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal
除了這幾種,還可以使用系統(tǒng)私有的動畫效果:
@"cube":立方體翻轉效果
@"oglFlip":翻轉效果
@"suckEffect":收縮效果,動畫方向不可控
@"rippleEffecct":水滴波紋效果,動畫方向不可控
@"pageCurl":向上翻頁效果
@"pageunCurl":向下翻頁效果
@"cameraIrisHollowOpen":攝像頭打開效果,動畫方向不可控
@"cameraIrisHollowClose":攝像頭關閉效果,動畫方向不可控

@property(nullable, copy) NSString *subtype;:可選類型,用于指定轉場的方向,可用值如下:
kCATransitionFromRight:一目了然,不解釋啦
kCATransitionFromLeft
kCATransitionFromTop
kCATransitionFromBottom

@property float startProgress;:開始進度,默認是0,表示動畫從頭開始。比如,設置成0.5,那么動畫就從一半的地方開始執(zhí)行
@property float endProgress;:結束進度,默認是1.比如設置成0.5,那么動畫就從頭開始,進行到0.5處停止

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容