- 每一個(gè)UIView都默認(rèn)關(guān)聯(lián)著一個(gè)CALayer,我們成這個(gè)layer為root layer
- 所有的非root layer都存在默認(rèn)的隱式動(dòng)畫(huà),隱式動(dòng)畫(huà)默認(rèn)為1/4秒。
iOS開(kāi)發(fā)中的動(dòng)畫(huà)分為兩種:
- 一種為UIView動(dòng)畫(huà),又稱隱式動(dòng)畫(huà),動(dòng)畫(huà)后frame的數(shù)值發(fā)生了變化。
- 另一種是CALayer動(dòng)畫(huà),又稱顯示動(dòng)畫(huà),動(dòng)畫(huà)后模型層的數(shù)據(jù)不會(huì)發(fā)生變化,圖形回到原來(lái)的位置。
但是在實(shí)際開(kāi)發(fā)中,因?yàn)閁IView可以響應(yīng)用戶交互,所以UIView動(dòng)畫(huà)用的多.
一個(gè)小小的demo:
- 點(diǎn)擊屏幕改變顏色 XXChangeColorViewController
- 點(diǎn)擊屏幕改變顏色運(yùn)用轉(zhuǎn)場(chǎng)動(dòng)畫(huà)實(shí)現(xiàn) XXCustomChangeColorViewController
- 點(diǎn)擊屏幕改變顏色,以及跟隨觸摸點(diǎn)改變位置 XXChangeColorAndFrameViewController
三個(gè)重要控制器源代碼如下
XXChangeColorViewController
#import "XXChangeColorViewController.h"
#define XXRamdomColor [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1]
@interface XXChangeColorViewController ()
//顯示顏色的layer
@property (nonatomic, strong) CALayer *colorLayer;
//colorView
@property (nonatomic, strong) UIView *colorView;
@end
@implementation XXChangeColorViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"點(diǎn)擊屏幕改變顏色";
//用layer實(shí)現(xiàn)
self.colorLayer = [CALayer layer];
self.colorLayer.frame = CGRectMake(100, 100, 100, 100);
self.colorLayer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:self.colorLayer];
//用view實(shí)現(xiàn)
UIView *colorView = [[UIView alloc] init];
self.colorView = colorView;
colorView.frame = CGRectMake(100, 300, 100, 100);
colorView.backgroundColor = [UIColor redColor];
[self.view addSubview:colorView];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
self.colorLayer.backgroundColor = XXRamdomColor.CGColor;
self.colorView.backgroundColor = XXRamdomColor;
}
@end
XXCustomChangeColorViewController
#import "XXCustomChangeColorViewController.h"
#define XXRamdomColor [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1]
@interface XXCustomChangeColorViewController ()
//colorLayer
@property (nonatomic, strong) CALayer *colorLayer;
@end
@implementation XXCustomChangeColorViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"自定義改變顏色";
//用layer實(shí)現(xiàn)
self.colorLayer = [CALayer layer];
self.colorLayer.frame = CGRectMake(100, 100, 100, 100);
self.colorLayer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:self.colorLayer];
//加入轉(zhuǎn)場(chǎng)動(dòng)畫(huà)
CATransition *transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
self.colorLayer.actions = @{@"backgroundColor": transition};
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
self.colorLayer.backgroundColor = XXRamdomColor.CGColor;
}
@end
XXChangeColorAndFrameViewController
#import "XXChangeColorAndFrameViewController.h"
#define XXRamdomColor [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1]
@interface XXChangeColorAndFrameViewController ()
//colorLayer
@property (nonatomic, strong) CALayer *colorLayer;
@end
@implementation XXChangeColorAndFrameViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"改變顏色以及跟隨手勢(shì)改變位置";
//用layer實(shí)現(xiàn)
self.colorLayer = [CALayer layer];
self.colorLayer.frame = CGRectMake(100, 100, 100, 100);
self.colorLayer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:self.colorLayer];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//獲取到當(dāng)前的觸摸點(diǎn)
CGPoint point = [[touches anyObject] locationInView:self.view];
//如果觸摸點(diǎn)在colorLayer范圍內(nèi),則改變顏色,否則跟隨手指改變位置
if ([self.colorLayer.presentationLayer hitTest:point]) {
self.colorLayer.backgroundColor = XXRamdomColor.CGColor;
}else {
[CATransaction begin];
[CATransaction setAnimationDuration:4.0];
self.colorLayer.position = point;
[CATransaction commit];
}
}
@end
效果如下圖

P9w9CArdI9S0hkAVHNyfnPrRjdTBKV5Y.gif
github源代碼地址: