可可在同一个字母中的不同文本颜色

时间:2011-02-16 23:37:11

标签: cocoa xcode draw

我需要的是有点难以解释。我们试试......

我需要在我的应用中编写一个文本,该文本将逐渐从左到右改变颜色。 我想我可以说它与你在卡拉OK屏幕上看到的效果相似。

例如。我画了一条蓝色的文字线,然后逐渐地,使用计时器,从左到右的颜色变为红色。但我不希望它逐字逐句改变。这需要在某个时刻,同一个字母的部分可以是红色而部分是蓝色。

我一直在阅读核心绘图,也许这是解决方案,但我真的不知道如何开始。我正在考虑使用背景图层,并在其顶部绘制透明文本(仅限边框),但我不太确定如何操作。

任何想法将不胜感激。

2 个答案:

答案 0 :(得分:3)

你可以用CGLayer完成这项工作。

最重要的是,您应该能够使用现有代码将字符(或其他任何内容)绘制到CGLayer中。

这是一些粗略的代码:

// first, make a CGLayer...

CGLayerRef yourDrawingPad = 
    CGLayerCreateWithContext(UIGraphicsGetCurrentContext(),etc..
CGContextRef yourRef = CGLayerGetContext(yourDrawingPad);

// now, draw to yourRef .. draw your various typography (or anything)
// use your current drawing code.

// all done drawing, now make an image mask...

UIGraphicsBeginImageContext(CGLayerGetSize(yourDrawingPad));
  CGContextRef temp = UIGraphicsGetCurrentContext();
  CGContextDrawLayerAtPoint(temp, CGPointZero, yourDrawingPad);
  CGImageRef anAlphaMask = CGBitmapContextCreateImage(temp);
UIGraphicsEndImageContext();

你现在可以使用一个很好的面具:

CGContextSaveGState(UIGraphicsGetCurrentContext()) ...
CGContextClipToMask(UIGraphicsGetCurrentContext(), self.frame, anAlphaMask);

所以只需将其屏蔽到渐变图像或任何有效的图像中。

(可以想象:也许您必须在屏幕外构建一个位图图像,然后将其用作蒙版?)

脚注:不要忘记你很可能不得不颠倒过来!幸运的是,处理起来很简单。在绘制之前它说“现在,绘制到yourRef”保存状态并添加两行代码:

CGContextTranslateCTM(refForMask, 0, self.frame.size.height);
CGContextScaleCTM(refForMask, 1.0, -1.0);

希望有所帮助

答案 1 :(得分:2)

我知道如何做到这一点,但它有点复杂。您可以创建NSBezierPath并为每个字符添加字形。然后,将其设置为剪辑并绘制NSGradient。然后你只需要改变NSGradient中颜色的偏移量来移动颜色。