OC-类似歌词字体颜色逐字变化的实现方法

 

预期实效果图如下:

 

 

如上图所示,文字的颜色会根据时间的移动,逐字变成绿色。

 

实现方法:
(1)调用方法:

  用 void UIRectFillUsingBlendMode(CGRect rect, CGBlendMode blendMode) 这个方法来实现

(2)实现逻辑:

  自定义Label,通过label的drawRect:方法 获取Label的图形上下文,使用调用UIRectFillUsingBlendMode:混合填充的方式来实现label颜色的绘制

(3)代码实现:

  创建自定义的label:

  .h 和.m的文件如下:

----------------.h--------------------
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface YALabel : UILabel

@property (nonatomic, assign) CGFloat progress ;

@end


----------------.m--------------------

#import "YALabel.h"

@implementation YALabel


- (void)drawRect:(CGRect)rect {
    
    [super drawRect:rect];

    [[UIColor greenColor] set]; // 填充
    
  // 这个rect的x、y、width、height 可根据自己的需求设置
    rect = CGRectMake(rect.size.width *self.progress - 20, rect.origin.y, 40, rect.size.height); 
    
    UIRectFillUsingBlendMode(rect, kCGBlendModeSourceIn);
}

- (void)setProgress:(CGFloat)progress {
    _progress = progress;
    [self setNeedsDisplay];
}

 

  调用:

<strong>#import "ViewController.h"

#import "YALabel.h"

@interface ViewController ()

@property (nonatomic,strong) YALabel * yaLabl ;

@property (nonatomic,assign) CGFloat progress ;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    self.yaLabl = [[YALabel alloc] initWithFrame:CGRectMake(10, 100, self.view.frame.size.width - 20, 30)];

    self.yaLabl.text = @"叶绿不同赏,叶黄不同悲;若问相思处,叶绿叶黄时~~~~~~~";
    self.yaLabl.textColor = [UIColor blackColor];
    self.yaLabl.font = [UIFont systemFontOfSize:18];
    
    [self.view addSubview:self.yaLabl];
    
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(update) userInfo:nil repeats:YES];
    
    self.progress = 0.0;

}

- (void)update {
    if (self.progress >= 1.0) {
        self.progress = 0.0;
    }
    self.progress += 0.01;
    self.yaLabl.progress = self.progress;
}
</strong>

 (4)注意事项:

  label不能设置背景色,如果设置了背景色,那么这个绘制的方式,是给label的背景色绘制,而不是给label的文字绘制颜色;

  下图是我添加了label的背景色后的效果:

(5)CGBlandMode参数为一个枚举类型,以及 每个枚举值的计算公式,提供一个参考链接,有兴趣就看看:

  https://www.jianshu.com/p/96cfd3697b21 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值