iOS動畫 CoreAnimation

* CoreAnimation*的結構圖

CoreAnimation結構圖

CoreAnimation的幾種動畫

  • CABasicAnimation 提供了最基礎的動畫屬性設置,是簡單的keyframe動畫性能,CABasicAnimation可以看做是一種CAKeyframeAnimation的簡單動畫,因為它只有頭尾的關鍵幀(keyframe)。
  • CAKeyframeAnimation 提供了通用的keyframe動畫功能層的屬性給我們使用,它允許我們設置一個特定的數組,這個數組是動畫在運動時的值,也就是說,CAKeyframeAnimation支持動畫的多個值設置。
  • CAAnimationGroup 可以保存一組動畫對象,將CAAnimationGroup對象加入圖層后,組中所有動畫對象可以同時并發運行。
  • CATransition 主要用于做過渡動畫或者轉場動畫,能夠為層提供移出屏幕和移入屏幕的動畫效果。 其中最主要的就是 type 和 subType 這兩個屬性。

iOS Animation-KeyPath

keyPath值                  說明                   值類型
position                  移動位置              CGPoint
opacity                透明度                0.0-1
bounds                  變大與位置              CGRect
bounds.size            由小變大             CGSize
backgroundColor        背景顏色             CGColor
cornerRadius              漸變圓角              任意數值
borderWidth            改變邊框border的粗細     任意數值
contents                  改變layer內容(圖片)   CGImage
transform.scale          縮放、放大             0.0-1.0
transform.rotation.x    旋轉動畫(翻轉,沿著X軸)   M_PI*n
transform.rotation.y    旋轉動畫(翻轉,沿著Y軸)   M_PI*n
transform.rotation.z    旋轉動畫(翻轉,沿著Z軸)   M_PI*n
transform.translation.x 橫向移動(沿著X軸)    任意數值
transform.translation.y 縱向移動(沿著Y軸)    任意數值

CABasicAnimation(基本動畫)

CABasicAnimation類只有三個屬性
@property(nullable, strong) id fromValue; //開始值
@property(nullable, strong) id toValue;   //結束值
@property(nullable, strong) id byValue;   //動畫的時間

示例代碼:下面為Label左側滑出的動畫

  CABasicAnimation * base = [CABasicAnimation animationWithKeyPath:@"position.x"];
    //起始點
    base.fromValue =@(-self.view.bounds.size.width/2);
    //結束點
    base.toValue = @(self.view.bounds.size.width/2) ;
    //時間間隔
    base.duration = 0.7;
   //決定當前對象在非active時間段的行為.比如動畫開始之前,動畫結束之后
    base.fillMode = kCAFillModeBoth;
    base.delegate = self;
   [self.titleLab.layer addAnimation: base forKey:nil];

CAKeyframeAnimation(關鍵幀動畫)


@property(nullable, copy) NSArray *values;  //關鍵幀數組
@property(nullable) CGPathRef path;
@property(nullable, copy) NSArray<NSNumber *> *keyTimes;//關鍵幀時間點

示例代碼:下面為Label上下震動動畫

  CAKeyframeAnimation * rotate = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];
    rotate.duration = 0.25;   //時間間隔
    rotate.repeatCount = 4;   //重復次數
    rotate.values =  @[@0,@(-M_PI_4/4),@0,@(M_PI_4/4), @0];    //關鍵幀數組
    rotate.keyTimes = @[@0,@0.25,@0.5,@0.75,@1.0];             //關鍵幀時間點數組
    [self.titleLab.layer addAnimation:rotate forKey:nil];

CAAnimationGroup(組合動畫)

@property(nullable, copy) NSArray<CAAnimation *> *animations; //動畫數組

示例代碼:給Button添加旋轉、漸現、縮放動畫

  CAAnimationGroup * group = [[CAAnimationGroup alloc]init];
    group.beginTime = CACurrentMediaTime() + 0.5; //當前時間延遲動畫
    group.duration = 0.5;  //動畫時間
    group.fillMode = kCAFillModeForwards; //決定當前對象在非active時間段的行為.比如動畫開始之前,動畫結束之后
    group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];//速度控制函數
    
    CABasicAnimation * scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    scaleAnim.fromValue = @(3.5);
    scaleAnim.toValue = @(1);
    
    CABasicAnimation * rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    rotateAnim.fromValue = @(M_PI_4);
    rotateAnim.toValue = @(0);
    
    CABasicAnimation * fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeAnim.fromValue = @(0);
    fadeAnim.toValue = @(1);
    
    group.animations = @[scaleAnim,rotateAnim,fadeAnim];
    [self.longinBtn.layer addAnimation:group forKey:nil];

CATransition(轉場動畫)

@property(copy) NSString *type;  //詳解在下面
@property(nullable, copy) NSString *subtype; //詳解在下面
@property float startProgress;
@property float endProgress;
@property(nullable, strong) id filter;
  • Type: 動畫類型
    公共Type(官方的SDK其實只提供了四種過渡效果)
CA_EXTERN NSString * const kCATransitionFade;
CA_EXTERN NSString * const kCATransitionMoveIn;
CA_EXTERN NSString * const kCATransitionPush;
CA_EXTERN NSString * const kCATransitionReveal;

私有的Type (私有API提供了其他很多非常炫的過渡動畫),需要自己額外寫的

NSString *const kCATransitionCube = @"cube"; 
NSString *const kCATransitionSuckEffect = @"suckEffect"; 
NSString *const kCATransitionOglFlip = @"oglFlip"; 
NSString *const kCATransitionRippleEffect = @"rippleEffect"; 
NSString *const kCATransitionPageCurl = @"pageCurl"; 
NSString *const kCATransitionPageUnCurl = @"pageUnCurl"; 
NSString *const kCATransitionCameraIrisHollowOpen = @"cameraIrisHollowOpen";
NSString *const kCATransitionCameraIrisHollowClose = @"cameraIrisHollowClose";
  • SubType: 動畫類型的方向
CA_EXTERN NSString * const kCATransitionFromRight;
CA_EXTERN NSString * const kCATransitionFromLeft;
CA_EXTERN NSString * const kCATransitionFromTop;
CA_EXTERN NSString * const kCATransitionFromBottom;

示例代碼及效果

  CATransition * transition = [CATransition animation];
    transition.type = kCATransitionCube; ;//設置動畫的類型
    transition.subtype = kCATransitionFromRight; //設置動畫的方向
    transition.duration = 1.0f;
    [self.testView.layer addAnimation:transition forKey:@"push"];

kCATransitionCube.gif

注:私有Type,審核的時候官網明確會拒絕

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容