2012-04-09 6 views
3

Ich möchte einen Text mit einem benutzerdefinierten Zeilenabstand haben, also schrieb ich meine ein Attribut Zeichenfolge mit CTParagraphStyleAttributte und übergeben es an 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]; 

Aber die Zeilenhöhe ändert sich nicht . Ich denke, ich vermisse etwas hier, aber ich weiß nicht was.

Ich habe versucht mit kCTParagraphStyleSpecifierLineSpacingAdjustment und kCTParagraphStyleSpecifierLineSpacing aber beide scheinen nicht zu funktionieren (?). Ich habe auch versucht, die Ausrichtung mit kCTParagraphStyleSpecifierAlignment (ich weiß, CATextLayer hat eine Eigenschaft dafür), nur um zu testen kCTParagraphStyleAttributeName ist in der Tat funktioniert und es nicht getan.

Ich habe festgestellt, dass selbst wenn ich einige verrückte Werte (zum Beispiel: CTParagraphStyleCreate(styleSettings, -555);) übergeben, was mich dazu bringt, mich selbst zu fragen: Unterstützt CATextLayer Absatzattribute? Wenn ja, was fehlt mir hier?

+0

A) Der Zähler arg 2 sollte eigentlich als CFIndex eingegeben werden. Aber da das nur Long Integer Typ speziell für die Expansion definiert ist, bezweifle ich, dass es wirklich das Problem ist. B) Ich habe CATextLayer dazu gebracht, einen Tabstopp über einen paragraphStyle aufzunehmen, also müssen einige dieser Attribute unterstützt werden - aber andere, erste Zeile und Kopfeinzug, hatten keinen Effekt, zumindest nicht in iOS 4.3. (Ich hoffe, jemand hat die Antwort, weil die Führung der TextLayer-Funktion wichtig scheint.) – Wienke

Antwort

3

Ich habe Ihren Code ausprobiert und den NSAttributedString in einen CATextLayer eingefügt, und er hat die Formatierung ignoriert, wie Sie gesagt haben.

Dann habe ich versucht, genau die gleiche attributierte Zeichenfolge zu einer UIView drawRect Methode mit CTFrameDraw zu zeichnen, und es befolgt alle Ihre Formatierung. Ich kann nur annehmen, dass CATextLayer den Großteil seiner Formatierung ignoriert. Die CATextLayer Class Reference hat eine Reihe von Warnungen darüber, was es im Interesse der Effizienz tut.

Wenn Sie wirklich zu einem CALayer zeichnen müssen, kein UIView, können Sie möglicherweise Ihre eigene CALayer-Unterklasse oder Delegate erstellen und dort die Zeichnung ausführen.

- (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

Danke Dondragmer;) Dies ist der Beweis, dass CATextLayer nicht alle Attribute in NSAttributedString unterstützt. – nacho4d