Как я могу нарисовать только 8 символов на строку в CTFrameRef? - PullRequest
0 голосов
/ 09 января 2012

Я пытаюсь нарисовать CTFrameRef только 8 символов в строке , но я не знаю, как это сделать с CTFrameRef .

Я прочитал « Ручной перенос строки », но они используют CTLine, и я думаю, что использовать CTFrameRef проще.

Возможно, с помощью какого-либо установщика кадров или изменения CGPath это возможно.

Это мой код прямо сейчас (я удалил строки комментариев с тестовым кодом о проблеме):

// Prepare font
    CTFontRef font = CTFontCreateWithName(CFSTR("LucidaSansUnicode"), 16, NULL);

// Create path        
    CGMutablePathRef gpath = CGPathCreateMutable();
    CGPathAddRect(gpath, NULL, CGRectMake(0, 0, 200, 200));

// Create an attributed string
    CGContextSetTextDrawingMode (newcontext, kCGTextFillStroke); 
    CGContextSetGrayFillColor(newcontext, 0.0, 1.0);

CFStringRef keys[] = { kCTFontAttributeName };
CFTypeRef values[] = { font };
CFDictionaryRef attr = CFDictionaryCreate(NULL, (const void **)&keys,
    (const void **)&values, sizeof(keys) / sizeof(keys[0]),
    &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFAttributedStringRef attrString = CFAttributedStringCreate(NULL, 
    CFSTR("Aenean lacinia bibendum nulla sed consectetur."), attr);

CTFramesetterRef framesetter = 
    CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attrString);

CTFrameRef theFrame = 
    CTFramesetterCreateFrame(framesetter, CFRangeMake(0,
    CFAttributedStringGetLength(attrString)), gpath, NULL);

CTFrameDraw(theFrame, newcontext);

// Clean up... CFRelease...

// Getting TIFF image

Я получаю следующую картину:

Wrong Image

Но я хочу что-то вроде этого (есть различия, потому что это изображение было сделано с помощью Photoshop):

Wanted Image

Спасибо и извините за мой английский.

1 Ответ

2 голосов
/ 09 января 2012

Почему вы думаете, что CTFrame проще для такого рода проблем, чем CTLine? Вы хотите необычный алгоритм разрыва строки. CTFrame использует алгоритм переноса строки по умолчанию.

Разбейте ваш ввод на 8-символьные NSAttributedString прогоны и создайте CTLineRef объекты с ними, затем нарисуйте их. Это должно быть чрезвычайно просто. Что вызывает путаницу?

...