2012-04-09 2 views
3

Я хочу иметь некоторый текст с настраиваемым линейным интервалом, так что я написал строку атрибутов с CTParagraphStyleAttributte и передать его на мой CATextLayer:CATextLayer + NSAttributtedString + CTParagraphStyleRef

UIFont *font = [UIFont systemFontOfSize:20]; 
CTFontRef ctFont = CTFontCreateWithName((CFStringRef)font.fontName, 
             font.pointSize, NULL); 
CGColorRef cgColor = [UIColor whiteColor].CGColor; 
CGFloat leading = 25.0; 
CTTextAlignment alignment = kCTRightTextAlignment; // just for test purposes 
const CTParagraphStyleSetting styleSettings[] = { 
    {kCTParagraphStyleSpecifierLineSpacingAdjustment, sizeof(CGFloat), &leading}, 
    {kCTParagraphStyleSpecifierAlignment, sizeof(CTTextAlignment), &alignment} 
}; 
CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(styleSettings, 2)); 
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: 
          (id)ctFont, (id)kCTFontAttributeName, 
          (id)cgColor, (id)kCTForegroundColorAttributeName, 
          (id)paragraphStyle, (id)kCTParagraphStyleAttributeName, 
          nil]; 
CFRelease(ctFont); 
CFRelease(paragraphStyle); 

NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] 
               initWithString:string 
                attributes:attributes]; 
_textLayer.string = attrStr; 
[attrStr release]; 

Но высота строки не меняется , Я думаю, что здесь что-то не хватает, но я не знаю, что.

Я пробовал с kCTParagraphStyleSpecifierLineSpacingAdjustment и kCTParagraphStyleSpecifierLineSpacing, но любой из них, похоже, не работает (?). Я также попытался установить выравнивание с помощью kCTParagraphStyleSpecifierAlignment (я знаю, что CATextLayer имеет свойство для этого), просто для проверки kCTParagraphStyleAttributeName действительно работает, и это не так.

Я заметил, что даже если я передаю некоторые сумасшедшие значения (например: CTParagraphStyleCreate(styleSettings, -555);), что заставляет меня спросить себя: CATextLayer поддерживает атрибуты абзаца? Если да, то что мне здесь не хватает?

+0

A) Счетчик arg 2 действительно должен быть напечатан как CFIndex. Но поскольку это просто длинный целочисленный тип, специально определенный для расширения, я сомневаюсь, что это действительно проблема. B) Я смог получить CATextLayer, чтобы получить табуляцию с помощью параметра paragraphStyle, поэтому он должен поддерживать некоторые из этих атрибутов, но другие, первый и третий отступы, не имели никакого эффекта, по крайней мере, не в iOS 4.3. (Надеюсь, у кого-то есть ответ, потому что ведущее кажется важным для функции textLayer.) – Wienke

ответ

3

Я пробовал свой код, помещая NSAttributedString в CATextLayer и игнорировал форматирование, как вы сказали.

Затем я попытался нарисовать точно такую ​​же атрибутированную строку методу UIView drawRect, используя CTFrameDraw, и он выполнил все ваши форматирования. Я могу только предположить, что CATextLayer игнорирует большинство его форматирования. CATextLayer Class Reference имеет ряд предупреждений о том, что он делает в интересах эффективности.

Если вам действительно нужно нарисовать CALayer, а не UIView, вы можете создать свой собственный класс или делегат CALayer и сделать чертеж там.

- (void)drawRect:(CGRect)rect 
{ 
    // 
    // Build attrStr as before. 
    // 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGRect bounds = [self bounds]; 

    // Text ends up drawn inverted, so we have to reverse it. 
    CGContextSetTextMatrix(ctx, CGAffineTransformIdentity); 
    CGContextTranslateCTM(ctx, bounds.origin.x, bounds.origin.y+bounds.size.height); 
    CGContextScaleCTM(ctx, 1, -1); 

    // Build a rectangle for drawing in. 
    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathAddRect(path, NULL, bounds); 

    // Create the frame and draw it into the graphics context 
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) attrStr); 
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL); 
    CFRelease(framesetter); 
    CFRelease(path); 

    // Finally do the drawing. 
    CTFrameDraw(frame, ctx); 
    CFRelease(frame);   
} 
+0

Спасибо Dondragmer;) Это доказательство того, что CATextLayer не поддерживает все атрибуты в NSAttributedString. – nacho4d

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

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