iOS動(dòng)畫(huà):01-改變顏色和位置

  • 每一個(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源代碼地址:

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

相關(guān)閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫(huà)效果,實(shí)現(xiàn)這些動(dòng)畫(huà)的過(guò)程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫(huà)全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,690評(píng)論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫(huà)效果,實(shí)現(xiàn)這些動(dòng)畫(huà)的過(guò)程并不復(fù)雜,今天將帶大家一窺iOS動(dòng)畫(huà)全貌。在這里你可以看...
    F麥子閱讀 5,270評(píng)論 5 13
  • 在iOS實(shí)際開(kāi)發(fā)中常用的動(dòng)畫(huà)無(wú)非是以下四種:UIView動(dòng)畫(huà),核心動(dòng)畫(huà),幀動(dòng)畫(huà),自定義轉(zhuǎn)場(chǎng)動(dòng)畫(huà)。 1.UIView...
    請(qǐng)叫我周小帥閱讀 3,323評(píng)論 1 23
  • 目錄: 主要繪圖框架介紹 CALayer 繪圖 貝塞爾曲線-UIBezierPath CALayer子類 補(bǔ)充:i...
    Ryan___閱讀 1,779評(píng)論 1 9
  • Core Animation Core Animation,中文翻譯為核心動(dòng)畫(huà),它是一組非常強(qiáng)大的動(dòng)畫(huà)處理API,...
    45b645c5912e閱讀 3,157評(píng)論 0 21

友情鏈接更多精彩內(nèi)容