Cocoa 在同一个字母中使用不同的文本颜色

Cocoa 在同一个字母中使用不同的文本颜色,cocoa,xcode,draw,Cocoa,Xcode,Draw,我需要的是有点难以解释。让我们试试 我需要在我的应用程序中写一个文本,该文本将从左向右逐渐改变颜色。 我想我可以说这和你在卡拉OK屏幕上看到的效果类似 比如说。我画了一条蓝色的文本线,然后使用计时器,从左到右逐渐变为红色。但我不希望它一个字母一个字母地改变,而是逐渐地改变。这就要求在某个时刻,同一个字母可以有红色部分和蓝色部分 我一直在读有关核心绘图的书,也许这就是解决方案,但我真的不知道如何开始。我曾考虑使用背景层,并在其顶部绘制一个透明文本(仅带边框),但我不太确定如何做到这一点 任何想法都

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

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

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

我一直在读有关核心绘图的书,也许这就是解决方案,但我真的不知道如何开始。我曾考虑使用背景层,并在其顶部绘制一个透明文本(仅带边框),但我不太确定如何做到这一点


任何想法都将不胜感激

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

我知道如何实现这一点,但这有点复杂。您可以创建NSBezierPath并为每个字符添加图示符。然后,将其设置为剪辑并绘制渐变。然后,您只需更改NSGradient中颜色的偏移量即可移动颜色。

您可能可以使用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);

希望它有帮助

您可能可以使用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);

希望对你有所帮助。我发表了一条评论,但不见了。也许我没有正确地添加它。又来了。我将尝试两种方法。谢谢你的帮助,真奇怪。我发表了一条评论,但不见了。也许我没有正确地添加它。又来了。我将尝试两种方法。谢谢你的帮助。