美文网首页图像处理相关
2018-08-17 iOS代码实现颜色渐变

2018-08-17 iOS代码实现颜色渐变

作者: 遵天循道 | 来源:发表于2018-08-17 11:42 被阅读0次

    转载:https://www.cnblogs.com/YouXianMing/p/3793913.html

    CAGradientLayer的一些属性解析

    iOS中Layer的坐标系统:

    效果:

    - (void)viewDidLoad

    {

        [super viewDidLoad];

        CAGradientLayer *colorLayer = [CAGradientLayer layer];

        colorLayer.frame    = (CGRect){CGPointZero, CGSizeMake(200,200)};

        colorLayer.position = self.view.center;

        [self.view.layer addSublayer:colorLayer];

        // 颜色分配colorLayer.colors = @[(__bridgeid)[UIColor redColor].CGColor,

                              (__bridge id)[UIColor greenColor].CGColor,

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

        // 颜色分割线colorLayer.locations  = @[@(0.25), @(0.5), @(0.75)];

        // 起始点colorLayer.startPoint = CGPointMake(0,0);

        // 结束点colorLayer.endPoint  = CGPointMake(1,0);

    }

    颜色分配严格遵守Layer的坐标系统,locations,startPoint,endPoint都是以Layer坐标系统进行计算的.

    而locations并不是表示颜色值所在位置,它表示的是颜色在Layer坐标系相对位置处要开始进行渐变颜色了.

    CAGradientLayer 的这四个属性 colors locations startPoint endPoint 都是可以进行动画的哦.

    附录:

    稍微复杂点的动画效果

    ////  RootViewController.m////  Copyright (c) 2014年 Y.X. All rights reserved.//#import"RootViewController.h"#import"YXGCD.h"@interface RootViewController ()

    @property (nonatomic, strong) GCDTimer  *timer;@end@implementation RootViewController- (void)viewDidLoad

    {

        [super viewDidLoad];

        CAGradientLayer *colorLayer = [CAGradientLayer layer];

        colorLayer.backgroundColor = [UIColor blueColor].CGColor;

        colorLayer.frame    = (CGRect){CGPointZero, CGSizeMake(200,200)};

        colorLayer.position = self.view.center;

        [self.view.layer addSublayer:colorLayer];

        // 颜色分配colorLayer.colors = @[(__bridgeid)[UIColor cyanColor].CGColor,

                              (__bridge id)[UIColor orangeColor].CGColor,

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

        // 起始点colorLayer.startPoint = CGPointMake(0,0);

        // 结束点colorLayer.endPoint  = CGPointMake(1,0);

        _timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];

        [_timer event:^{

            staticCGFloat test = -0.1f;

            if(test >=1.1)

            {

                test = -0.1f;

                [CATransaction setDisableActions:YES];

                colorLayer.locations  = @[@(test), @(test +0.05), @(test +0.1)];

            }

            else        {

                [CATransaction setDisableActions:NO];

                colorLayer.locations  = @[@(test), @(test +0.05), @(test +0.1)];

            }

            test +=0.1f;

        } timeInterval:NSEC_PER_SEC];

        [_timer start];

    }@end

    _timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];

        [_timer event:^{

            staticCGFloat test = -0.1f;

            if(test >=1.1)

            {

                test = -0.1f;

                [CATransaction setDisableActions:NO];

                colorLayer.locations  = @[@(test), @(test +0.01), @(test +0.011)];

            }

            else        {

                [CATransaction setDisableActions:NO];

                colorLayer.locations  = @[@(test), @(test +0.01), @(test +0.011)];

            }

            test +=0.1f;

        } timeInterval:NSEC_PER_SEC];

        [_timer start];

    配合CAShapeLayer使用

    ////  RootViewController.m////  Copyright (c) 2014年 Y.X. All rights reserved.//#import"RootViewController.h"#import"YXGCD.h"@interface RootViewController ()

    @property (nonatomic, strong) GCDTimer  *timer;@end// 将常数转换为度数#defineDEGREES(degrees)  ((M_PI * (degrees))/ 180.f)@implementation RootViewController- (void)viewDidLoad

    {

        [super viewDidLoad];

        self.view.backgroundColor = [UIColor blackColor];

        CAGradientLayer *colorLayer = [CAGradientLayer layer];

        colorLayer.backgroundColor = [UIColor blueColor].CGColor;

        colorLayer.frame    = (CGRect){CGPointZero, CGSizeMake(200,200)};

        colorLayer.position = self.view.center;

        [self.view.layer addSublayer:colorLayer];

        // 颜色分配colorLayer.colors = @[(__bridgeid)[UIColor redColor].CGColor,

                              (__bridge id)[UIColor whiteColor].CGColor,

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

        colorLayer.locations  = @[@(-0.2), @(-0.1), @(0)];

        // 起始点colorLayer.startPoint = CGPointMake(0,0);

        // 结束点colorLayer.endPoint  = CGPointMake(1,0);

        CAShapeLayer *circle = [RootViewController LayerWithCircleCenter:CGPointMake(102,100)

                                                                  radius:80                                                          startAngle:DEGREES(0)

                                                                endAngle:DEGREES(360)

                                                              clockwise:YES

                                                        lineDashPattern:nil];

        circle.strokeColor = [UIColor redColor].CGColor;

        [self.view.layer addSublayer:circle];

        circle.strokeEnd =1.f;

        colorLayer.mask = circle;

        _timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];

        [_timer event:^{

            staticinti =0;

            if(i++ %2==0)

            {

                CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"locations"];

                fadeAnim.fromValue = @[@(-0.2), @(-0.1), @(0)];

                fadeAnim.toValue  = @[@(1.0), @(1.1), @(1.2)];

                fadeAnim.duration  =1.5;

                [colorLayer addAnimation:fadeAnim forKey:nil];

            }

        } timeInterval:NSEC_PER_SEC];

        [_timer start];

    }+ (CAShapeLayer *)LayerWithCircleCenter:(CGPoint)point

                                    radius:(CGFloat)radius

                                startAngle:(CGFloat)startAngle

                                  endAngle:(CGFloat)endAngle

                                  clockwise:(BOOL)clockwise

                            lineDashPattern:(NSArray *)lineDashPattern

    {

        CAShapeLayer *layer = [CAShapeLayer layer];

        // 贝塞尔曲线(创建一个圆)UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(0,0)

                                                            radius:radius

                                                        startAngle:startAngle

                                                          endAngle:endAngle

                                                        clockwise:clockwise];

        // 获取pathlayer.path = path.CGPath;

        layer.position = point;

        // 设置填充颜色为透明layer.fillColor = [UIColor clearColor].CGColor;

        // 获取曲线分段的方式if (lineDashPattern)

        {

            layer.lineDashPattern = lineDashPattern;

        }

        return layer;

    }@end

    相关文章

      网友评论

        本文标题:2018-08-17 iOS代码实现颜色渐变

        本文链接:https://www.haomeiwen.com/subject/awuzbftx.html