视图的层颜色正在变化时如何使不同的颜色外观

我正在做一些自定义的下载进度栏(分类)的UIButton (或)我也可以在UIView做到这一点,每一件事情都很好,现在我想改变标题的颜色作为收益的进展,例如作为你在下面的图片中可以看到现在我正在得到什么,

在这里输入图像说明

我想要的就像下面的图像

在这里输入图像说明

我想将标题的颜色更改为白色或其他颜色作为下载进行,有没有什么办法可以做,任何示例代码。

我通过使用下面的代码来实现这一点

  - (void)drawInContext:(CGContextRef)progressContext { CGContextSetFillColorWithColor(progressContext, self.progressLayerColor.CGColor); CGMutablePathRef Path = CGPathCreateMutable(); CGRect boundsRect = self.bounds; CGPathMoveToPoint(Path, NULL, boundsRect.origin.x, boundsRect.origin.y); CGPathAddRect(Path, NULL, CGRectMake(0, 0, self.progress, 35)); CGPathCloseSubpath(Path); CGContextAddPath(progressContext, Path); CGContextFillPath(progressContext); CGContextSetBlendMode(progressContext, kCGBlendModeClear); CGContextFillPath(progressContext); CGPathRelease(Path); } 

我会用两个UILabels做,一个用绿色背景和白色文字,一个用白色背景和黑色文字,绿色用另一个用另一个用相同的框架。

最上面的标签有一个CAShapeLayer,因为它是图层蒙版 。 CAShapeLayer在整个长度上从左到右有一个宽的(至less是标签的高度)黑色笔划。

默认情况下,这将使整个视图呈绿色。 到目前为止,没用。

但是,CAShapeLayer具有(animation式) strokeEnd属性。 如果将其设置为0.0,则绿色标签将不可见。 设为0.5,你看到一半和一半。

现在,您只需更新此遮罩层的strokeEnd属性即可创build进度表的animation。

在@ jrturtonbuild议的帮助下,我可以做出这样的进度条,

 CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.frame = _labelGreen.bounds;//it the label on top with green background and white text color CGMutablePathRef mutPath = CGPathCreateMutable(); CGPathMoveToPoint(mutPath, NULL, 0, 0); CGPathAddRect(mutPath, NULL, CGRectMake( 0, 0, progress, _labelGreen.frame.size.height)); //as the progress cganges the width of mask layer also changes maskLayer.path = mutPath;//set the path _labelGreen.layer.mask = maskLayer; 

结果输出如下图所示 在这里输入图像说明

一个简单的解决scheme是使用2个UIImageViews 。 下面的图片会有白色背景和黑色文字的图片,上面的图片会有绿色背景和白色文字。 下面的图片将始终具有相同的框架,但另一个将以宽度0开始。随着下载的进行,您将增加其宽度,并开始覆盖下面的图片(使用黑色字体)。 当然,您可以使用视图模式:留在扩展图像视图上,始终使图像位于左侧而不resize。