Какао Различный цвет текста в одной и той же букве - PullRequest
0 голосов
/ 17 февраля 2011

То, что мне нужно, немного сложно объяснить.Давайте попробуем ...

Мне нужно написать текст в моем приложении, и этот текст будет постепенно менять цвет слева направо.Я думаю, что могу сказать, что это похоже на то, что вы видите на экране караоке.

Например.Я рисую текстовую линию синим цветом, и постепенно, используя таймер, цвет слева направо меняется на красный.Но я не хочу, чтобы это меняло букву за буквой, но постепенно.Для этого потребовалось бы, чтобы в какой-то момент одна и та же буква могла иметь часть, выделенную красным, и часть, выделенную синим.

Я читал о базовом рисунке, и, возможно, это решение, но я действительно незнаю с чего начать.Я думал об использовании фонового слоя и поверх него нарисую прозрачный текст (только с рамкой), но я не очень уверен, как это сделать.

любые идеи будут оценены.

Ответы [ 2 ]

3 голосов
/ 17 февраля 2011

Вы, вероятно, можете выполнять эту работу с 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);

Надеюсь, это поможет

2 голосов
/ 17 февраля 2011

У меня есть идея, как это можно сделать, но это довольно сложно.Вы можете создать NSBezierPath и добавить глифы для каждого символа.Затем установите это как клип и нарисуйте NSGradient.Тогда вам просто нужно изменить смещение цветов в NSGradient, чтобы переместить цвет вдоль.

...