修改UILabel指定区域(CGRect)文字修改颜色,需要创建一个指定区域的CALayer,并将其作用于UILabel的父视图,通过将UILabel的图层layer映射给指定区域的CALayer的mask来进行设置。因为是将UILabel的图层layer映射给指定区域的CALayer的mask,所以不能给UILabel设置backgroundColor等属性,让UILabel的layer中只有文字图层。
先假设titleLabel是父视图superView上的一个视图,而我们现在要使titleLabel的gradientRect区域的颜色变为一个redColor到blueColor的渐变色:
1.首先我们需要绘制UILabel的文字颜色图层:
CAGradientLayer * labelLayer = [CAGradientLayer layer];
labelLayer.startPoint = CGPointMake(0.0,1.0);
labelLayer.endPoint = CGPointMake(1.0,1.0);
labelLayer.frame =titleLabel.frame;
labelLayer.colors =@[(id)titleLabel.textColor.CGColor,(id)titleLabel.textColor.CGColor];
2.接下来绘制指定区域的文字颜色图层:
CAGradientLayer * subLayer = [CAGradientLayer layer];
subLayer.startPoint = CGPointMake(0.0,1.0);
subLayer.endPoint = CGPointMake(1.0,1.0);
subLayer.frame =gradientRect;//注意这个gradientRect是指定区域相对于父视图superView的坐标,因为这个CALayer是要作用于父视图superView的
subLayer.colors =@[(id)[UIColor redColor].CGColor,(id)[UIColor blueColor].CGColor];
subLayer.cornerRadius =gradientRect.size.height/2.0;
[labelLayer addSublayer:subLayer];
3.将UILabel的图层layer映射给指定区域的CALayer的mask,我们想要获得UILabel的图层layer,需要在UILabel的布局加载到superView上后设置。因此我们需要(方法一)在superView的-(void)layoutSubviews;方法中设置,或者也可以(方法二)调用[superView layoutIfNeed]方法后进行设置,当然这个方法有时实际上并不能成功加载布局,所以建议使用方法一:
[labelLayer removeFromSuperlayer];
[self.layer addSublayer:labelLayer];
labelLayer.mask =titleLabel.layer;