OCiOS開發:CAGradientLayer 漸變色


OCiOS開發:CAGradientLayer 漸變色

CAGradientLayer 簡介

  • CAGradientLayer是CALayer圖層類的子類,用於處理漸變色的層結構。
  • CAGradientLayer的漸變色可以做隱式動畫。
  • CAGradientLayer和CAShapeLayer配合使用可實現復雜效果。
  • CAGradientLayer可以用作PNG的遮罩效果。

CAGradientLayer 坐標系統

  • CAGradientLayer的坐標系統是從坐標(0,0)到(1,1)繪制的矩形。
  • CAGradientLayer的frame值的size不為正方形的話,坐標系統會被拉伸。
  • CAGradientLayer的startPoint與endPoint會直接影響顏色的繪制方向。
  • CAGradientLayer的顏色分割點是以0~1的比例來計算的,顏色分割點為漸變色開始或終止的地方。

CAGradientLayer 屬性介紹

  • colors:漸變顏色數組
  • locations:漸變顏色的區間分布(分割點),locations的數組長度和colors一致。這個屬性可不設,默認是nil,系統會平均分布顏色如果有特定需要可設置,數組設置為0 ~ 1之間單調遞增。
  • startPoint:映射locations中起始位置,用單位向量表示。比如(0, 0)表示從左上角開始變化。默認值是:(0.5, 0.0)
  • endPoint:映射locations中結束位置,用單位向量表示。比如(1, 1)表示到右下角變化結束。默認值是:(0.5, 1.0)
  • type:默認值是kCAGradientLayerAxial,表示按像素均勻變化。

CAGradientLayer 案例

三原色漸變

  • 效果展示
  • 代碼示例

- (void)viewDidLoad {

 

    [super viewDidLoad];

 

    /**< 初始化colorsView */

    UIView *colorsView = [[UIView alloc] init];

    colorsView.bounds = CGRectMake(0, 0, 220, 220);

    colorsView.center = self.view.center;

    [self.view addSubview:colorsView];

 

    /**< 初始化漸變層 */

    CAGradientLayer *gradientColorLayer = [CAGradientLayer layer];

    gradientColorLayer.frame = colorsView.bounds;

    [colorsView.layer addSublayer:gradientColorLayer];

 

    /**< 設置顏色組 */

    gradientColorLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,

                                  (__bridge id)[UIColor greenColor].CGColor,

                                  (__bridge id)[UIColor blueColor].CGColor];

 

    /**< 設置顏色分割點 */

    gradientColorLayer.locations  = @[@(0.25), @(0.5), @(0.75)];

 

 

    /**< 設置漸變顏色方向 */

    // 1、起始位置

    gradientColorLayer.startPoint = CGPointMake(0, 0);

    // 2、結束位置

    gradientColorLayer.endPoint   = CGPointMake(0, 1);

 

}

  •  分割點動畫
  • 效果展示
  • 代碼示例

#import "ViewController.h"

 

@interface ViewController ()

 

@property (strong, nonatomic) CAGradientLayer *gradientLayer;

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

 

    [super viewDidLoad];

 

    // 添加 CAGradientLayer

    [self.view.layer addSublayer:self.gradientLayer];

 

    // 延時3秒執行,實現分割點動畫(隱式動畫)

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        // 顏色分割點效果

        self.gradientLayer.locations = @[@(0.4), @(0.5), @(0.6)];

    });

 

}

 

#pragma mark - Getter methods

 

- (CAGradientLayer *)gradientLayer {

    if (!_gradientLayer) {

        // 初始化並創建

        _gradientLayer             = [CAGradientLayer layer];

        _gradientLayer.frame       = CGRectMake(0, 0, 250, 250);

        _gradientLayer.position    = self.view.center;

        _gradientLayer.borderWidth = 1.f;

 

        // 設置顏色

        _gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,

                                  (__bridge id)[UIColor greenColor].CGColor,

                                  (__bridge id)[UIColor blueColor].CGColor];

 

        // 設置顏色漸變方向

        _gradientLayer.startPoint = CGPointMake(0, 0);

        _gradientLayer.endPoint   = CGPointMake(1, 0);

 

        // 設置顏色分割點

        _gradientLayer.locations  = @[@(0.25), @(0.5), @(0.75)];

    }

    return _gradientLayer;

}

 

@end

  •  

色差動畫

  • 實現思路
    • 確定漸變色漸變方向;
    • 至少設定兩種顏色,此處設置兩種顏色為例,其中一種是透明色,另外一種是自定義顏色。
    • 設定好locations顏色分割點。
  • 效果展示
  • 代碼示例

#import "ViewController.h"

 

@interface ViewController () {

 

    NSTimer *_timer; /**< 定時器 */

}

 

@property (strong, nonatomic) CAGradientLayer *gradientLayer; /**< 漸變層 */

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

 

    [super viewDidLoad];

 

    self.view.backgroundColor = [UIColor blackColor];

 

    // 創建背景圖片

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];

    imageView.bounds       = CGRectMake(0, 0, 260, 450);

    imageView.center       = self.view.center;

    [self.view addSubview:imageView];

 

    // 添加漸變層

    [imageView.layer addSublayer:self.gradientLayer];

 

    // 初始化定時器

    _timer = [NSTimer scheduledTimerWithTimeInterval:1.f

                                              target:self

                                            selector:@selector(respondsToTimerEvent)

                                            userInfo:nil

                                             repeats:YES];

 

 

}

 

#pragma mark - Timer and animations methods

- (void)respondsToTimerEvent {

    // 設定顏色組動畫

    self.gradientLayer.colors = @[(__bridge id)[UIColor clearColor].CGColor,

                                  (__bridge id)[UIColor colorWithRed:arc4random()%255 / 255.f

                                                               green:arc4random()%255 / 255.f

                                                                blue:arc4random()%255 / 255.f

                                                               alpha:1].CGColor];

    // 設置顏色分割點動畫

    self.gradientLayer.locations = @[@(arc4random() %10 / 10.f), @(1.f)];

}

 

#pragma mark - Getter methods

- (CAGradientLayer *)gradientLayer {

    if (!_gradientLayer) {

        // 初始化漸變層

        _gradientLayer       = [CAGradientLayer layer];

        _gradientLayer.frame = CGRectMake(0, 0, 260, 450);

 

        // 設置顏色漸變方向

        _gradientLayer.startPoint = CGPointMake(0, 0);

        _gradientLayer.endPoint   = CGPointMake(0, 1);

 

        // 設定顏色組

        _gradientLayer.colors = @[(__bridge id)[UIColor clearColor].CGColor,

                                  (__bridge id)[UIColor blueColor].CGColor];

 

        // 設定顏色分割點

        _gradientLayer.locations = @[@(0.5f), @(1.f)];

    }

    return _gradientLayer;

}

 

@end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM