iOS中的核心動畫

  • 在iOS中躏率,你能看的見摸得著的東西基本上都是UIView,比如一個按鈕民鼓、一個文本標簽薇芝、一個文字輸入框,一個圖標等等丰嘉,這些都是UIView
  • 其實UIView之所以能顯示在屏幕夯到, 完全是應(yīng)為它內(nèi)部的一個圖層
  • 在創(chuàng)建UIView對象時,UIView內(nèi)部會自動創(chuàng)建一個圖層(即CALayer對象),通過UIView的layer屬性可以訪問這個層
@property(nonatomic,readonly,retain)CALayer*layer; 
  • UIView需要顯示到屏幕上時饮亏,會調(diào)用drawRect:方法進行繪圖耍贾,并且會將所有的內(nèi)容繪制在自己的圖層上,繪圖完畢后路幸,徐彤會講圖層拷貝到屏幕上荐开,于是就完成了UIView的顯示
  • 換句話說,UIView本身不具備顯示的功能简肴,是它內(nèi)部的層才有顯示功能

<h5>CALayer的基本使用</h5>

  • 通過操作CALayer對象晃听,可以很方便地調(diào)整UIView的一些外觀屬性,比如:
    • 陰影
    • 圓角大小
    • 邊框?qū)挾群皖伾?/li>
    • … …
  • 還可以給圖層添加動畫砰识,來實現(xiàn)一些比較炫酷的效果

<b>UIView的Layer</b>

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 設(shè)置陰影的顏色
    self.colorV.layer.shadowColor = [UIColor blackColor].CGColor;
    // 設(shè)置陰影的不透明度
    self.colorV.layer.shadowOpacity = 1;
    // 設(shè)置陰影的偏移量
    self.colorV.layer.shadowOffset = CGSizeMake(30, 30);
    // 設(shè)置陰影的模糊半徑
    self.colorV.layer.shadowRadius = 10;
    
    // 邊框?qū)挾饶馨牵锩孀叩?    self.colorV.layer.borderWidth = 10;
    // 邊框顏色,
    self.colorV.layer.borderColor = [UIColor brownColor].CGColor;
    
    // 設(shè)置圓角
    self.colorV.layer.cornerRadius = 30;
}

最終呈現(xiàn)效果


UIViewCALayer基本使用演示.gif

<b>UIView的Layer</b>

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    // 設(shè)置陰影的顏色
    self.imageV.layer.shadowColor = [UIColor blackColor].CGColor;
    // 設(shè)置陰影的不透明度
    self.imageV.layer.shadowOpacity = 1;
    // 設(shè)置陰影的偏移量
    self.imageV.layer.shadowOffset = CGSizeMake(30, 30);
    // 設(shè)置陰影的模糊半徑
    self.imageV.layer.shadowRadius = 10;
    
    // 邊框?qū)挾缺枥牵锩孀叩?    self.imageV.layer.borderWidth = 10;
    // 邊框顏色初斑,
    self.imageV.layer.borderColor = [UIColor brownColor].CGColor;

    // 注意:UIImageView的layer使用有些不一樣,在設(shè)置圓角的時候需要注意:
    // 設(shè)置圓角
    self.imageV.layer.cornerRadius = 100;
}

呈現(xiàn)效果:


UIImage的CALayer基本使用演示1.gif

<b>原因:CALayer層中予借,有一個專門存放圖片的層:contents</b>

    self.imageV.layer.masksToBounds = YES;

呈現(xiàn)效果:


UIImage的CALayer基本使用演示2.gif

<h5>CATransform3D</h5>

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    // 3D效果
    [UIView animateWithDuration:0.5 animations:^{

        // 第一種設(shè)置方法:
        self.imageV.layer.transform = CATransform3DMakeRotation(M_PI, 1, 1, 0);
        
        // 把結(jié)構(gòu)體換成對象
        NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 1, 0)];
        
        // 第二種設(shè)置方式:
        // 我們一般通過KVC做快速旋轉(zhuǎn)越平。平移频蛔,縮放
        [self.imageV.layer setValue:@(M_PI) forKey:@"transform.rotation.x"];
    }];
}

<b>在第二種方法中灵迫,forKey的值不是隨便填寫的,它在CATransform3D Key Paths中有規(guī)定</b>

Field Key Path Description
rotation.x Set to an NSNumber object whose value is the rotation, in radians, in the x axis.
rotation.y Set to an NSNumber object whose value is the rotation, in radians, in the y axis.
rotation.z Set to an NSNumber object whose value is the rotation, in radians, in the z axis.
rotation Set to an NSNumber object whose value is the rotation, in radians, in the z axis. This field is identical to setting the rotation.z field.
scale.x Set to an NSNumber object whose value is the scale factor for the x axis.
scale.y Set to an NSNumber object whose value is the scale factor for the y axis.
scale.z Set to an NSNumber object whose value is the scale factor for the z axis.
scale Set to an NSNumber object whose value is the average of all three scale factors.
translation.x Set to an NSNumber object whose value is the translation factor along the x axis.
translation.y Set to an NSNumber object whose value is the translation factor along the y axis.
translation.z Set to an NSNumber object whose value is the translation factor along the z axis.
translation Set to an NSValue object containing an NSSize or CGSize data type. That data type indicates the amount to translate in the x and y axis.

<h5>UIView和CALayer的選擇</h5>

使用Layer展示一張圖片

    
    CALayer *layer = [[CALayer alloc] init];
    layer.backgroundColor = [UIColor brownColor].CGColor;
    layer.frame = CGRectMake(100, 100, 100, 100);
    
    [self.view.layer addSublayer:layer];
    
    layer.contents = (id)[UIImage imageNamed:@"123.png"].CGImage;

<b>關(guān)于CALayer的疑惑</b>

  • 首先
    • CALayer是定義在QuartzCore框架中的
    • CGImageRef晦溪、CGColorRef兩種數(shù)據(jù)類型是定義在CoreGraphics框架中的
    • UIColor瀑粥、UIImage是定義在UIKit框架中的
  • 其次
    • QuartzCore框架和CoreGraphics框架是可以跨平臺使用的,在iOS和Mac OS X上都能使用
    • 但是UIKit只能在iOS中使用
  • 為了保證可移植性三圆,QuartzCore不能使用UIImage狞换、UIColor避咆,只能使用CGImageRef、CGColorRef

<b>UIView和CALayer的選擇</b>

  • 通過CALayer修噪,就能做出跟UIImageView一樣的界面效果
  • 既然CALayer和UIView都能實現(xiàn)相同的顯示效果查库,那究竟該選擇誰好呢?
    • 其實黄琼,對比CALayer樊销,UIView多了一個事件處理的功能。也就是說脏款,CALayer不能處理用戶的觸摸事件围苫,而UIView可以
    • 所以,如果顯示出來的東西需要跟用戶進行交互的話撤师,用UIView剂府;如果不需要跟用戶進行交互,用UIView或者CALayer都可以
    • 當然剃盾,CALayer的性能會高一些腺占,因為它少了事件處理的功能,更加輕量級

<h5>position和anchorPoint</h5>

<b>CALayer有2個非常重要的屬性:positionanchorPoint</b>

  • @property CGPoint position;
    • 用來設(shè)置CALayer在父層中的位置
    • 以父層的左上角為原點(0, 0)
  • @property CGPoint anchorPoint;
    • 稱為“定位點”万俗、“錨點”
    • 決定著CALayer身上的哪個點會在position屬性所指的位置
    • 以自己的左上角為原點(0, 0)
    • 它的x湾笛、y取值范圍都是0~1,默認值為(0.5, 0.5)

<b> UIView的center和layer的position是一個點</br>
position和anchorPoint 點重合</b>

<h5>隱式動畫</h5>

  • 每一個UIView內(nèi)部都默認關(guān)聯(lián)著一個CALayer闰歪,我們可用稱這個Layer為Root Layer(根層)
  • 所有的非RootLayer嚎研,也就是手動創(chuàng)建的CALayer對象,都存在著隱式動畫
  • 什么是隱式動畫库倘?
    • 當對非RootLayer的部分屬性進行修改時临扮,默認會自動產(chǎn)生一些動畫效果
    • 而這些屬性稱為AnimatableProperties(可動畫屬性)
  • 列舉幾個常見的AnimatableProperties:
    • bounds:用于設(shè)置CALayer的寬度和高度。修改這個屬性會產(chǎn)生縮放動畫
    • backgroundColor:用于設(shè)置CALayer的背景色教翩。修改這個屬性會產(chǎn)生背景色的漸變動畫
    • position:用于設(shè)置CALayer的位置杆勇。修改這個屬性會產(chǎn)生平移動畫
  • l可以通過動畫事務(wù)(CATransaction)關(guān)閉默認的隱式動畫效果
         // 只有非根層才有隱式動畫(自己手動創(chuàng)建)
         [CATransaction  begin];
         [CATransaction setAnimationDuration: 2.0];
         [CATransaction  setDisableActions:YES];

         [CATransaction  commit];

<b>掛鐘案例</b>

// 在storyboard中拖一個UIImageView并確定寬高相同,然后拖線饱亿,然后添加圖片
@property (weak, nonatomic) IBOutlet UIImageView *clockView;

/** 當前的秒針 */
@property (nonatomic, strong) CALayer *secondLayer;
/** 當前的分針 */
@property (nonatomic, strong) CALayer *minuteLayer;
/** 當前的時針 */
@property (nonatomic, strong) CALayer *hourLayer;
// 代碼中用到的宏
//每一秒旋轉(zhuǎn)的度數(shù)
#define perSecondAngle 6
//每一分旋轉(zhuǎn)的度數(shù)
#define perMinuteAngle 6
//每一分旋轉(zhuǎn)的度數(shù)
#define perHourAngle 30

// 每一分鐘蚜退,時針旋轉(zhuǎn)的角度
#define perMinuteWithHourRotateAngle 0.5

// 角度轉(zhuǎn)弧度的宏
#define angle2radian(angle) ((angle) / 180.0 * M_PI)
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self setHourLayer];

    [self setMinuteLayer];

    [self setSecondLayer];
    
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
    
    // 為了防止剛開始,秒針跳一下彪笼,在加載的時候就調(diào)用一次钻注,
    [self timeChange];  
}
- (void)timeChange {

    NSCalendar *calendar = [NSCalendar currentCalendar];
    // components: 是日歷的組件, 年配猫,月幅恋,日,時泵肄,分捆交,秒
    //fromDate: 從什么時間開始獲取
    NSDateComponents *dateComponents = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];
    
    // 獲取當前是多少秒
    NSInteger currentSecond = dateComponents.second + 1;
    
    // 秒針開始旋轉(zhuǎn)
    // 計算秒針當前旋轉(zhuǎn)的角度
    // angle = 當前多少秒 * 每一秒旋轉(zhuǎn)的角度
    CGFloat secondAngle = currentSecond * perSecondAngle;
    self.secondLayer.transform = CATransform3DMakeRotation(angle2radian(secondAngle), 0, 0, 1);
    
    // 獲取當前是多少分
    NSInteger currentMinute = dateComponents.minute;
    
    // 分針開始旋轉(zhuǎn)
    // 計算秒針當前旋轉(zhuǎn)的角度
    // angle = 當前多少分 * 每一分旋轉(zhuǎn)的角度
    CGFloat minuteAngle = currentMinute * perMinuteAngle;
    self.minuteLayer.transform = CATransform3DMakeRotation(angle2radian(minuteAngle), 0, 0, 1);
    
    // 獲取當前是多少小時
    NSInteger currentHour = dateComponents.hour;
    
    // 分針開始旋轉(zhuǎn)
    // 計算秒針當前旋轉(zhuǎn)的角度
    // angle = 當前多少小時 * 每一小時旋轉(zhuǎn)的角度
    CGFloat hourAngle = currentHour * perHourAngle + currentMinute * perMinuteWithHourRotateAngle;
    self.hourLayer.transform = CATransform3DMakeRotation(angle2radian(hourAngle), 0, 0, 1);
    
}
// // 添加秒針
- (void)setSecondLayer {
    
    CALayer *secondLayer = [CALayer layer];
    secondLayer.bounds = CGRectMake(0, 0, 1, 80);
    secondLayer.backgroundColor = [UIColor redColor].CGColor;
    secondLayer.anchorPoint = CGPointMake(0.5, 1);
    secondLayer.position = CGPointMake(self.clockView.bounds.size.width * 0.5, self.clockView.bounds.size.height * 0.5);
    [self.clockView.layer addSublayer:secondLayer];
    self.secondLayer = secondLayer;
}
// // 添加分針
- (void)setMinuteLayer {
    
    CALayer *minuteLayer = [CALayer layer];
    minuteLayer.bounds = CGRectMake(0, 0, 2, 70);
    minuteLayer.backgroundColor = [UIColor blackColor].CGColor;
    minuteLayer.cornerRadius = 1.5;
    minuteLayer.anchorPoint = CGPointMake(0.5, 1);
    minuteLayer.position = CGPointMake(self.clockView.bounds.size.width * 0.5, self.clockView.bounds.size.height * 0.5);
    [self.clockView.layer addSublayer:minuteLayer];
    
    self.minuteLayer = minuteLayer;
}
// // 添加時針
- (void)setHourLayer {
    
    CALayer *hourLayer = [CALayer layer];
    hourLayer.bounds = CGRectMake(0, 0, 3, 50);
    hourLayer.backgroundColor = [UIColor blackColor].CGColor;
    hourLayer.cornerRadius = 1.5;
    hourLayer.anchorPoint = CGPointMake(0.5, 1);
    hourLayer.position = CGPointMake(self.clockView.bounds.size.width * 0.5, self.clockView.bounds.size.height * 0.5);
    [self.clockView.layer addSublayer:hourLayer];
    
    self.hourLayer = hourLayer;
}

<h5>Core Animation</h5>

  • Core Animation淑翼,中文翻譯為核心動畫,它是一組非常強大的動畫處理API品追,使用它能做出非常炫麗的動畫效果玄括,而且往往是事半功倍。也就是說肉瓦,使用少量的代碼就可以實現(xiàn)非常強大的功能惠豺。
  • Core Animation可以用在Mac OS X和iOS平臺。
  • Core Animation的動畫執(zhí)行過程都是在后臺操作的风宁,不會阻塞主線程洁墙。
  • 要注意的是,Core Animation是直接作用在CALayer上的戒财,并非UIView热监。
  • 喬幫主在2007年的WWDC大會上親自為你演示Core Animation的強大:點擊查看視頻

<h5>核心動畫繼承結(jié)構(gòu)</h5>

<b>注意:圖中的黑色虛線代表“繼承”某個類,紅色虛線代表“遵守”某個協(xié)議</b>


核心動畫繼承結(jié)構(gòu).png

<h5>Core Animation的使用步驟</h5>

  • 如果不是xcode5之后的版本饮寞,使用它需要先添加QuartzCore.framework和引入對應(yīng)的框架<QuartzCore/QuartzCore.h>
  • 開發(fā)步驟:
    • 1.首先得有CALayer
    • 2.初始化一個CAAnimation對象孝扛,并設(shè)置一些動畫相關(guān)屬性
    • 3.通過調(diào)用CALayer的addAnimation:forKey:方法,增加CAAnimation對象到CALayer中幽崩,這樣就能開始執(zhí)行動畫了
    • 4.通過調(diào)用CALayer的removeAnimationForKey:方法可以停止CALayer中的動畫

<h5>CAAnimation——簡介</h5>

  • CAAnimation是所有動畫對象的父類苦始,負責控制動畫的持續(xù)時間和速度,是個抽象類慌申,不能直接使用陌选,應(yīng)該使用它具體的子類
  • 屬性說明:(紅色代表來自CAMediaTiming協(xié)議的屬性)
    • duration:動畫的持續(xù)時間
    • repeatCount:重復次數(shù),無限循環(huán)可以設(shè)置<b>HUGE_VALF</b>或者<b>MAXFLOAT</b>
    • repeatDuration:重復時間
    • removedOnCompletion:默認為YES蹄溉,代表動畫執(zhí)行完畢后就從圖層上移除咨油,圖形會恢復到動畫執(zhí)行前的狀態(tài)。<b>如果想讓圖層保持顯示動畫執(zhí)行后的狀態(tài)柒爵,那就設(shè)置為NO役电,不過還要設(shè)置fillMode為kCAFillModeForwards</b>
    • fillMode:決定當前對象在非active時間段的行為。比如動畫開始之前或者動畫結(jié)束之后
    • beginTime:可以用來設(shè)置動畫延遲執(zhí)行時間棉胀,若想延遲2s法瑟,就設(shè)置為CACurrentMediaTime()+2,<b>CACurrentMediaTime()</b>為圖層的當前時間
    • timingFunction:速度控制函數(shù)唁奢,控制動畫運行的節(jié)奏
    • delegate:動畫代理

<b>CAAnimation——動畫填充模式</b>

  • fillMode屬性值(要想fillMode有效霎挟,最好設(shè)置removedOnCompletion = NO)
    • kCAFillModeRemoved 這個是默認值,也就是說當動畫開始前和動畫結(jié)束后驮瞧,動畫對layer都沒有影響氓扛,動畫結(jié)束后枯芬,layer會恢復到之前的狀態(tài)
    • kCAFillModeForwards 當動畫結(jié)束后论笔,layer會一直保持著動畫最后的狀態(tài)
    • kCAFillModeBackwards 在動畫開始前采郎,只需要將動畫加入了一個layer,layer便立即進入動畫的初始狀態(tài)并等待動畫開始狂魔。
    • kCAFillModeBoth 這個其實就是上面兩個的合成.動畫加入后開始之前蒜埋,layer便處于動畫初始狀態(tài),動畫結(jié)束后layer保持動畫最后的狀態(tài)

<b>CAAnimation——速度控制函數(shù)</b>

  • 速度控制函數(shù)(CAMediaTimingFunction)
    • 1.kCAMediaTimingFunctionLinear(線性):勻速最楷,給你一個相對靜態(tài)的感覺
    • 2.kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入整份,然后加速離開
    • 3.kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入,然后減速的到達目的地
    • 4.kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入籽孙,中間加速烈评,然后減速的到達目的地。這個是默認的動畫行為犯建。

<b>CAAnimation——動畫代理方法</b>

  • CAAnimation在分類中定義了代理方法
@interfaceNSObject(CAAnimationDelegate)

/*Called when the animation begins its active duration. */

-(void)animationDidStart:(CAAnimation*)anim;

/*Called when the animation either completes its active duration or
 * is removed from the object it is attached to(i.e. the layer). 'flag'
 * is true if the animation reached the end ofits active duration
 * without being removed. */

-(void)animationDidStop:(CAAnimation*)animfinished:(BOOL)flag;

@end

<h5>CABasicAnimation(基礎(chǔ)動畫)基本使用</h5>

簡單心跳制作

// storyboard中拖一個200*200的ImageView讲冠,并拖線
@property (weak, nonatomic) IBOutlet UIImageView *imageV;

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    // 1.創(chuàng)建動畫對象
    CABasicAnimation *basicAnimation = [CABasicAnimation animation];
    
    // 2.設(shè)置動畫屬性值
    basicAnimation.keyPath = @"transform.scale";
    basicAnimation.toValue = @0;
    
    // 設(shè)置動畫執(zhí)行的次數(shù)
    basicAnimation.repeatCount = MAXFLOAT;
    
    // 設(shè)置動畫執(zhí)行長度
    basicAnimation.duration = 1;
    
    // 自動翻轉(zhuǎn)(怎么樣去,怎么樣回來)
    basicAnimation.autoreverses = YES;
    
    /**
     // 3.添加動畫
     
     @param CAAnimation 動畫對象
     @param NSString (forKey)添加動畫組需要用到的標識
     */
    [self.imageV.layer addAnimation:basicAnimation forKey:nil];
}

呈現(xiàn)效果:


簡單心跳制作.gif

<h5>CAKeyframeAnimation(幀動畫)基本使用</h5>

簡單制作卸載程序的抖動效果

// 1.第一種簡單使用适瓦,values——
/** 角度轉(zhuǎn)弧度 */
#define angle2radian(angle) ((angle) / 180.0 * M_PI)
@property (weak, nonatomic) IBOutlet UIImageView *iconV;
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    // 1.創(chuàng)建動畫
    CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animation];
    
    // 2.設(shè)置動畫屬性值
    keyframeAnimation.keyPath = @"transform.rotation";
    keyframeAnimation.values = @[@(angle2radian(-5)), @(angle2radian(5)), @(angle2radian(-5))];
    
    keyframeAnimation.repeatCount = MAXFLOAT;
    keyframeAnimation.duration = 0.2;
    
//    keyframeAnimation.autoreverses = YES;
    
    [self.iconV.layer addAnimation:keyframeAnimation forKey:nil];
}

呈現(xiàn)效果:


圖標抖動.gif

// 2.第二種簡單使用竿开,path——
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    // 1.創(chuàng)建動畫
    CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animation];
    
    keyframeAnimation.duration = 2;
    keyframeAnimation.autoreverses = YES;
    keyframeAnimation.repeatCount = MAXFLOAT;
    
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(50, 70)];
    [path addLineToPoint:CGPointMake(300, 100)];
    [path addLineToPoint:CGPointMake(100, 90)];
    
    keyframeAnimation.keyPath = @"position";
    keyframeAnimation.path = path.CGPath;
    
    [self.iconV.layer addAnimation:keyframeAnimation forKey:nil];
}

呈現(xiàn)效果:


圖標沿路徑做動畫.gif

<h5>CATransition(轉(zhuǎn)場動畫)基本使用</h5>

// storyboard創(chuàng)建ImageView設(shè)置寬高,并拖線
@property (weak, nonatomic) IBOutlet UIImageView *photoV;

static int _i = 0;
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    // 轉(zhuǎn)場代碼和轉(zhuǎn)場動畫必須得在同一個方法中
    // // 轉(zhuǎn)場代碼
    _i++;
    if (_i == 5) {
        _i = 0;
    }
    NSString *imageName = [NSString stringWithFormat:@"%d", _i];
    self.photoV.image = [UIImage imageNamed:imageName];
    
    // // 轉(zhuǎn)場動畫
    // 添加動畫
    CATransition *transitionAnimation = [CATransition animation];
    
    // 設(shè)置轉(zhuǎn)場動畫
    transitionAnimation.type = @"rippleEffect";
    
    // 設(shè)置動畫的起始位置 ------+++------
    transitionAnimation.startProgress = 0.3;
    // 設(shè)置動畫的結(jié)束位置 ------+++------
    transitionAnimation.endProgress = 0.5;
    
    transitionAnimation.duration = 1;
    
    [self.photoV.layer addAnimation:transitionAnimation forKey:nil];
}

呈現(xiàn)效果:


轉(zhuǎn)場動畫.gif

<b>轉(zhuǎn)場動畫過渡效果</b>

類型字符串 效果說明 關(guān)鍵字 方向
fade 交叉淡化過渡 YES
push 新視圖把舊視圖推出去 YES
moveIn 新視圖移到舊視圖上面 YES
reveal 將舊視圖移開,顯示下面的新視圖 YES
cube 立方體翻滾效果
oglFlip 上下左右翻轉(zhuǎn)效果
suckEffect 收縮效果玻熙,如一塊布被抽走 NO
rippleEffect 水滴效果 NO
pageCurl 向上翻頁效果
pageUnCurl 向下翻頁效果
cameraIrisHollowOpen 相機鏡頭打開效果 NO
cameraIrisHollowClose 相機鏡頭關(guān)閉效果 NO

<h5>CAAnimationGroup(動畫組)基本使用</h5>

@property (weak, nonatomic) IBOutlet UIView *colorView;
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    CABasicAnimation *basicAnimation01 = [CABasicAnimation animation];
    basicAnimation01.keyPath = @"position.y";
    basicAnimation01.toValue = @300;
    
//    basicAnimation01.removedOnCompletion = NO;
//    basicAnimation01.fillMode = kCAFillModeForwards;
//    
//    [self.colorView.layer addAnimation:basicAnimation01 forKey:nil];
    
    CABasicAnimation *basicAnimation02 = [CABasicAnimation animation];
    basicAnimation02.keyPath = @"transform.scale";
    basicAnimation02.toValue = @0.5;
    
//    basicAnimation02.removedOnCompletion = NO;
//    basicAnimation02.fillMode = kCAFillModeForwards;
//    
//    [self.colorView.layer addAnimation:basicAnimation02 forKey:nil];
    
    CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
    // 會自動執(zhí)行animations數(shù)組當中的所有動畫對象
    animationGroup.animations = @[basicAnimation01, basicAnimation02];
    
    animationGroup.removedOnCompletion = NO;
    animationGroup.fillMode = kCAFillModeForwards;
    
    [self.colorView.layer addAnimation:animationGroup forKey:nil];
}

呈現(xiàn)效果:


動畫組.gif

<h5>UIView與核心動畫區(qū)別</h5>

  1. 核心動畫只作用在layer上
  2. 核心動畫看到的都是假象否彩,它并沒有修改UIView的真實位置

<b>什么時候使用核心動畫</b>

  1. 當不需要與用戶進行交互的時候,使用核心動畫
  2. 當需要根據(jù)路徑做動畫的時候嗦随,使用核心動畫
  3. 當作轉(zhuǎn)場動畫時列荔,使用核心動畫(轉(zhuǎn)場類型比較多)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枚尼,隨后出現(xiàn)的幾起案子肌毅,更是在濱河造成了極大的恐慌,老刑警劉巖姑原,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悬而,死亡現(xiàn)場離奇詭異,居然都是意外死亡锭汛,警方通過查閱死者的電腦和手機笨奠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唤殴,“玉大人般婆,你說我怎么就攤上這事《涫牛” “怎么了蔚袍?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我啤咽,道長晋辆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任宇整,我火速辦了婚禮瓶佳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鳞青。我一直安慰自己霸饲,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布臂拓。 她就那樣靜靜地躺著厚脉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胶惰。 梳的紋絲不亂的頭發(fā)上器仗,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音童番,去河邊找鬼精钮。 笑死,一個胖子當著我的面吹牛剃斧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幼东,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脓杉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起球散,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蕉堰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屋讶,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡须教,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片划乖。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诀拭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煤蚌,我是刑警寧澤耕挨,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站尉桩,受9級特大地震影響筒占,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜘犁,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一翰苫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧这橙,春花似錦奏窑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鹰晨,卻和暖如春墨叛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背模蜡。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工漠趁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忍疾。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓闯传,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卤妒。 傳聞我的和親對象是個殘疾皇子丸边,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復雜荚孵,今天將帶大家一窺ios動畫全貌妹窖。在這里你可以看...
    每天刷兩次牙閱讀 8,469評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復雜收叶,今天將帶大家一窺iOS動畫全貌骄呼。在這里你可以看...
    F麥子閱讀 5,101評論 5 13
  • 前言 本文只要描述了iOS中的Core Animation(核心動畫:隱式動畫、顯示動畫)蜓萄、貝塞爾曲線、UIVie...
    GitHubPorter閱讀 3,607評論 7 11
  • 在iOS實際開發(fā)中常用的動畫無非是以下四種:UIView動畫辟犀,核心動畫堂竟,幀動畫出嘹,自定義轉(zhuǎn)場動畫咬崔。 1.UIView...
    請叫我周小帥閱讀 3,082評論 1 23
  • 書寫的很好垮斯,翻譯的也棒!感謝譯者丸升,感謝感謝狡耻! iOS-Core-Animation-Advanced-Techni...
    錢噓噓閱讀 2,292評論 0 6