前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS_追光动效(色值渐变)

iOS_追光动效(色值渐变)

作者头像
mikimo
发布2022-07-20 14:57:41
3990
发布2022-07-20 14:57:41
举报
文章被收录于专栏:iOS开发~iOS开发~

追光动效实现

效果如下:

在这里插入图片描述
在这里插入图片描述

实现:

如下图,红框为一个UIVIewCAGradientLayerstartPointendPoint的取值是(0,0)(1,1)

先实现简单的渐变效果,将红色和蓝色放入colors,从左上角到右下角渐变:

代码语言:javascript
复制
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 150, 300, 188)];
view.layer.cornerRadius = 4.0;
view.layer.masksToBounds = YES;

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = view.bounds;
gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,
                         (__bridge id)[UIColor blueColor].CGColor];
gradientLayer.startPoint = CGPointMake(0.0, 0.0);
gradientLayer.endPoint = CGPointMake(1.0, 1.0);
[view.layer addSublayer:gradientLayer];

[self.view addSubview:view];

效果如下:

渐变
渐变

为了实现渐变的动态效果,可以将红色和蓝色的坐标以对角线的形式,沿着UIView的边框顺时针移动坐标:

如:红点移动到(0.5,0)时,蓝点移动到(0.5,1) 。。。。 为此,顺时针算出所有的坐标:

代码语言:javascript
复制
- (NSArray *)sidePoints {
    NSMutableArray *points = [NSMutableArray array];
    CGFloat min = 0.0;
    CGFloat max = 1.0;
    CGFloat spacing = 0.5;
    // top side
    for (CGFloat x = min; x <= max; x += spacing) {
        [points addObject:@[@(x), @(0)]];
    }
    // right side
    for (CGFloat y = min + spacing; y <= max; y += spacing) {
        [points addObject:@[@(1), @(y)]];
    }
    // bottom side
    for (CGFloat x = max - spacing; x >= min; x -= spacing) {
        [points addObject:@[@(x), @(1)]];
    }
    // left side
    for (CGFloat y = max - spacing; y >= min; y -= spacing) {
        [points addObject:@[@(0), @(y)]];
    }
    return [points copy];
}

然后用NSTimer不停的更换startPointendPoint的坐标:

代码语言:javascript
复制
__block NSUInteger index = 0;
_timer = [NSTimer scheduledTimerWithTimeInterval:0.1 repeats:YES block:^(NSTimer * _Nonnull timer) {

    NSUInteger redIndex = index % (points.count - 1);
    NSUInteger yelIndex = (index + (points.count / 2 + 1)) % (points.count - 1);

    NSArray *redArr = points[redIndex];
    NSArray *yelArr = points[yelIndex];

    NSNumber *redX = redArr[0];
    NSNumber *redY = redArr[1];
    NSNumber *yelX = yelArr[0];
    NSNumber *yelY = yelArr[1];

    gradientLayer.startPoint = CGPointMake(redX.floatValue, redY.floatValue);
    gradientLayer.endPoint = CGPointMake(yelX.floatValue, yelY.floatValue);

    index++;
    index = index % (points.count - 1);
}];
[_timer setFireDate:[NSDate date]];

效果如下:

在这里插入图片描述
在这里插入图片描述

为了让动效更湿滑,可以把sidePoints方法里的spacing改小。 然后将图盖在上面,最终效果如下:

在这里插入图片描述
在这里插入图片描述

Github Demo 地址

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 追光动效实现
  • 实现:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档