iOS 文字渐变色的实现

项目中需要实现的效果:

实现方法:自定义CFGradientLabel继承于UILabel,实现 drawRect: 方法,在该方法里面画渐变色。

在 CFGradientLabel.h 里

#import <UIKit/UIKit.h>

@interface CFGradientLabel : UILabel

@property (nonatomic,copy) NSArray *colors;

@end

在CFGradientLabel.m 里

#import "CFGradientLabel.h"

@implementation CFGradientLabel

- (void)drawRect:(CGRect)rect
{
    CGSize textSize = [self.text sizeWithAttributes:@{NSFontAttributeName : self.font}];
    CGRect textRect = (CGRect){0, 0, textSize};
   
    // 画文字(不做显示用,主要作用是设置layer的mask)
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self.textColor set];
    [self.text drawWithRect:rect options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : self.font} context:NULL];
    
    // 坐标
    CGContextTranslateCTM(context, 0.0f, rect.size.height- (rect.size.height - textSize.height)*0.5);
    CGContextScaleCTM(context, 1.0f, -1.0f);
    
    CGImageRef alphaMask = NULL;
    alphaMask = CGBitmapContextCreateImage(context);
    CGContextClearRect(context, rect);// 清除之前画的文字

     // 设置mask
    CGContextClipToMask(context, rect, alphaMask);
    
    // 画渐变色
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)self.colors, NULL);
    CGPoint startPoint = CGPointMake(textRect.origin.x,
                                     textRect.origin.y);
    CGPoint endPoint = CGPointMake(textRect.origin.x + textRect.size.width,
                                   textRect.origin.y + textRect.size.height);
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
    
    // 释放内存
    CGColorSpaceRelease(colorSpace);
    CGGradientRelease(gradient);
    CFRelease(alphaMask);
}

@end

创建渐变色label:

CFGradientLabel *gradientLbl = [[CFGradientLabel alloc] init];
    [self.view addSubview:gradientLbl];
    [gradientLbl mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(addNumLbl.mas_right).offset(1);
        make.centerY.equalTo(addNumLbl.mas_centerY);
    }];
    gradientLbl.text = @"(确定后无法更改)";
    gradientLbl.font = FONT(13);
    gradientLbl.colors = @[(id)RGB(254, 42, 61).CGColor,(id)RGB(255, 198, 21).CGColor];
    gradientLbl.layer.masksToBounds = YES;

猜你喜欢

转载自blog.csdn.net/Alexander_Wei/article/details/78052099