2015-02-19 9 views
0

Я рисую текст поверх сплошного цвета фона, и пока он появляется, эффект , применяемый к атрибутной строке, не отображается - вы можете видеть только цвет текста, а не дополнительный белый контур, который обеспечивает желаемый внешний вид. Это выглядит по существу точно так же, как если бы я не применял эффект нажатия. Почему это, как я могу правильно нарисовать текст с текстом?Потеря NSTextEffectLetterpressStyle при рисовании в CGBitmapContext

let bitmapContext = CGBitmapContextCreate(nil, UInt(imageRect.width), UInt(imageRect.height), UInt(8), UInt(imageRect.width * 16), CGColorSpaceCreateDeviceRGB(), CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)) 

CGContextSetFillColorWithColor(bitmapContext, UIColor.blackColor().CGColor) 
let fullBox = CGRectMake(0, 0, imageRect.width, imageRect.height) 
CGContextAddRect(bitmapContext, fullBox) 
CGContextFillPath(bitmapContext) 

CGContextSetTextDrawingMode(bitmapContext, kCGTextFill) 
CGContextSetTextPosition(bitmapContext, drawPoint.x, drawPoint.y) 
let coloredAttributedString = NSAttributedString(string: "20", attributes:[NSFontAttributeName: myFont, NSForegroundColorAttributeName: textColor, NSTextEffectAttributeName: NSTextEffectLetterpressStyle]) 
let displayLineTextColored = CTLineCreateWithAttributedString(coloredAttributedString) 
CTLineDraw(displayLineTextColored, bitmapContext) 

let cgImage = CGBitmapContextCreateImage(bitmapContext) 
var myImage = CIImage(CGImage: dateStampCGImage) 

Это результат:
enter image description here

Это то, что я ожидал, что это будет (обратите внимание на бело-иш контур):
enter image description here

ответ

0

Оба CFAttributedString и NSAttributedString могут применяться произвольно атрибуты диапазонов. Приписанные типы строк не интерпретируют атрибуты по сути.

Скорее, технологии рисования струн интерпретируют атрибуты. Core Text понимает другой набор атрибутов, чем UIKit или AppKit. Набор атрибутов, поддерживаемых Core Text, задокументирован here. Он не перечисляет (эквивалент) NSTextEffectAttributeName.

Если вы настроили текущий графический контекст с помощью UIGraphicsBeginImageContextWithOptions() и нарисуете его, используя методы рисования NSAttributedString, это должно сработать, так как он использует UIKit для рисования.

+0

Спасибо Кен, я использовал графический контекст, чтобы получить этот эффект, но это более интенсивно для памяти, чем использование растрового контекста. В этом случае мне нужна высокая производительность. Вы видите, что любое другое решение избегает использования графического контекста? – Joey

+0

Они оба графические контексты. Как вы определили, что интенсивность памяти больше, чем другая? –

+0

Вы также можете иметь рендеринг UIKit в контексте растрового изображения Core Graphics, нажав его с помощью 'UIGraphicsPushContext()'. Важно то, что UIKit имеет неявный «текущий» контекст, используемый его операциями рисования. Итак, если вы хотите использовать рисунок UIKit, вам нужно учесть, что его текущий контекст является одним из ваших. –

 Смежные вопросы

  • Нет связанных вопросов^_^