Core Animation | 核心動畫簡介
核心動畫位于UIKit的下一層俏站,相比UIView動畫,它可以實現(xiàn)更復雜的動畫效果,Core Animation是一組功能強大、效果華麗的動畫API,無論在iOS系統(tǒng)或者在你開發(fā)的App中嚎货,都會有大量的應用場景
-
核心動畫位置
在UIKit框架中位置
-
核心動畫表現(xiàn)得兩張形式
顯示動畫/隱式動畫
-
核心動畫中可以直接使用的類
- CABasicAnimation (基本動畫)
- CAKeyframeAnimation (關(guān)鍵幀動畫)
- CATransition (轉(zhuǎn)場動畫)
- CAAnimationGroup (動畫組)
- CASpringAnimation (彈簧動畫)
效果演示One / 抖動
點擊屏幕觸發(fā)抖動效果
-
需要定義的角度宏
#define angleToRadians(angle) ((angle) / 180.0 *M_PI)
-
核心代碼
- (void)ShakeDemo {
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
anim.keyPath = @"transform.rotation";
anim.values = @[@angleToRadians(-6), @angleToRadians(6)];
anim.repeatCount = MAXFLOAT;
// anim.duration = 2;
anim.autoreverses = YES;
anim.speed = 2;
[_imgView.layer addAnimation:anim forKey:nil];
}
說明
- keyPath是設置動畫的type,大家可以根據(jù)自己的需求設置
- repeatCount是重復的意思,如果不設置的話需要在values中在次添加6到-6的值蔫浆,否知-6到6有動畫殖属,反過來就沒有動畫了
- 如果設置repeatCount屬性,那么speed就是設置頻率瓦盛,默認是0.5
- repeatCount是重復次數(shù)洗显,默認我們設置最大即可
效果演示Two / 過山車動畫并隨機改變顏色和大小
-
效果演示
移動中并隨機改變顏色和大小
-
核心代碼
- (void)Demo{
// 曲線
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(50, 200)];
[path addCurveToPoint:CGPointMake(300, 200) controlPoint1:CGPointMake(180, 100) controlPoint2:CGPointMake(200, 300)];
//需要添加在layer上
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = path.CGPath;
shapeLayer.fillColor = nil;
shapeLayer.strokeColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:shapeLayer];
CALayer *colorLayer = [CALayer layer];
colorLayer.frame = CGRectMake(0, 0, 60, 60);
colorLayer.position = CGPointMake(50, 200);
colorLayer.backgroundColor = [UIColor blueColor].CGColor;
[self.view.layer addSublayer:colorLayer];
// 過山車的動畫
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
anim.keyPath = @"position";
anim.path = path.CGPath;
// anim.duration = 4.0f;
// anim.removedOnCompletion = NO;
// anim.fillMode = kCAFillModeForwards;
// anim.rotationMode = kCAAnimationRotateAuto;
// [colorLayer addAnimation:anim forKey:nil];
// 改變大小
CABasicAnimation *sizeAnim = [CABasicAnimation animation];
sizeAnim.keyPath = @"transform.scale";
sizeAnim.toValue = @.5;
// sizeAnim.duration = 4.0;
// sizeAnim.fillMode = kCAFillModeForwards;
// sizeAnim.removedOnCompletion = NO;
//
// [colorLayer addAnimation:sizeAnim forKey:nil];
// 修改顏色
CGFloat red = arc4random() / (CGFloat)INT_MAX;
CGFloat green = arc4random() / (CGFloat)INT_MAX;
CGFloat blue = arc4random() / (CGFloat)INT_MAX;
UIColor *color = [UIColor colorWithRed:red green:green blue:blue alpha:1];
CABasicAnimation *colorAnim = [CABasicAnimation animation];
colorAnim.keyPath = @"backgroundColor";
colorAnim.toValue = (id)color.CGColor;
// colorAnim.duration = 4.0f;
// colorAnim.fillMode = kCAFillModeForwards;
// colorAnim.removedOnCompletion = NO;
// [colorLayer addAnimation:colorAnim forKey:nil];
CAAnimationGroup *group = [CAAnimationGroup animation];
group.animations = @[anim, sizeAnim, colorAnim];
group.duration = 4.0f;
group.fillMode = kCAFillModeForwards;
group.removedOnCompletion = NO;
[colorLayer addAnimation:group forKey:nil];
}
代碼說明/邏輯可以使用2中方法實現(xiàn)
- 不使用CAAnimationGroup動畫組的形式,把屏蔽的代碼打開即可
- 使用CAAnimationGroup動畫組形式,把重復的動畫設置全部都到動畫組中處理,即把屏蔽的代碼刪除即可
- 這是核心動畫幾個類的綜合使用,提供大家參考