2013-10-09 8 views
28

Ich arbeite an einer neuen Version meiner App und versuche, veraltete Nachrichten zu ersetzen, bin aber nicht in der Lage, über diese zu kommen.drawInRect: withAttributes vs drawInRect: withFont: lineBreakMode: Ausrichtung

Ich kann nicht herausfinden, warum drawInRect:withAttributes nicht funktioniert. Der Code wird ordnungsgemäß angezeigt, wenn die Nachricht drawInRect:withFont:lineBreakMode:alignment gesendet wird, funktioniert aber nicht, wenn drawInRect:withAttributes gesendet wird.

Ich benutze die gleiche Rect und Schriftart und ich glaube, dass der gleiche Textstil ist. Die Konstanten positionieren das Rechteck direkt unter einem Bild, aber ich benutze das gleiche Rechteck für beide Aufrufe, also bin ich mir sicher, dass das Rechteck korrekt ist.

(beachten Sie, dass bs.name unten ist ein NSString-Objekt verwendet)

 CGRect textRect = CGRectMake(fCol*kRVCiPadAlbumColumnWidth, 
            kRVCiPadAlbumColumnWidth-kRVCiPadTextLabelYOffset, 
            kRVCiPadAlbumColumnWidth, 
            kRVCiPadTextLabelHeight); 
     NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy]; 
     textStyle.lineBreakMode = NSLineBreakByWordWrapping; 
     textStyle.alignment = NSTextAlignmentCenter; 
     UIFont *textFont = [UIFont systemFontOfSize:16]; 

Das funktioniert nicht (es ist nichts auf dem Bildschirm gezeichnet) die Variablen von oben

 [bs.name drawInRect:textRect 
      withAttributes:@{NSFontAttributeName:textFont, 
           NSParagraphStyleAttributeName:textStyle}]; 
mit

Dies funktioniert (die Zeichenfolge wird ordnungsgemäß auf dem Bildschirm gezeichnet) mit den gleichen Variablen von oben

 [bs.name drawInRect:textRect 
        withFont:textFont 
       lineBreakMode:NSLineBreakByWordWrapping 
        alignment:NSTextAlignmentCenter]; 

Jede Hilfe wäre großartig. Vielen Dank.

+0

Was meinen Sie damit, dass 'drawInRect: withAttributes:' nicht funktioniert? –

+0

Sehr gute Frage. Entschuldigung, ich habe es nicht ausgearbeitet. Die Zeichenfolge, die in bs.name enthalten ist, wird korrekt mit der drainInRect: withFont: lineBreakMode: alignment-Nachricht auf dem Bildschirm gezeichnet, erscheint jedoch nicht, wenn drawInRect verwendet wird: withAttributes-Nachricht (nichts wird gezeichnet). –

Antwort

28

Ich habe ein UIView mit drawRect: gemacht nur mit dem Code versehen Sie

- (void)drawRect:(CGRect)frame 
{ 
    NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy]; 
    textStyle.lineBreakMode = NSLineBreakByWordWrapping; 
    textStyle.alignment = NSTextAlignmentCenter; 
    UIFont *textFont = [UIFont systemFontOfSize:16]; 

    NSString *text = @"Lorem ipsum"; 

    // iOS 7 way 
    [text drawInRect:frame withAttributes:@{NSFontAttributeName:textFont, NSParagraphStyleAttributeName:textStyle}]; 

    // pre iOS 7 way 
    CGFloat margin = 16; 
    CGRect bottomFrame = CGRectMake(0, margin, frame.size.width, frame.size.height - margin); 
    [text drawInRect:bottomFrame withFont:textFont lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentCenter]; 
} 

Ich sehe keinen Unterschied zwischen den Ausgängen dieser beiden Methoden. Vielleicht ist das Problem woanders in deinem Code?

+0

Vielen Dank für Ihre Arbeit mit dieser Antwort. Mein Code wird auch von einem drawRect ausgeführt: in einer UIView. Ich stimme zu, dass es irgendwo anders sein muss, aber wenn ich das eine oder andere ausdenke, funktioniert das andere nicht. Vielleicht muss das Rechteck neu berechnet werden, aus welchen Gründen auch immer, anders unter iOS 7 (nur für Info, der iOS 7 Weg ist drawInRect: withAttributes). Ich werde ein bisschen mehr mit dem Rechteck herumspielen. Danke noch einmal. –

+0

Stellen Sie sicher, dass 'CGRect' an beide Methoden übergeben wurde. Sie können auch versuchen, 1) die Textfarbe zu ändern, 2) einen Hintergrund auf Ihr Rechteck zu zeichnen, nur um sicherzustellen, dass es dort positioniert ist, wo Sie es haben möchten. Diese Schritte sind eher simpel, aber vielleicht helfen sie, das Problem zu finden. –

+0

Ich verwende den exakt gleichen Code in genau der gleichen Methode (nicht zwei Methoden). Wenn Sie drawRect: (old) mit drawRect: (new) an genau der gleichen Stelle im Code unter Verwendung des exakt gleichen Rechtecks ​​ersetzen, funktioniert eines, das andere nicht. Ich bin immer noch ratlos. Wenn ich etwas finde, werde ich posten. –

36

Um die Farbe des Textes einzustellen, müssen Sie die NSForegroundColorAttributeName im Attribut als zusätzlichen Parameter übergeben.

NSDictionary *dictionary = @{ NSFontAttributeName: self.font, 
           NSParagraphStyleAttributeName: paragraphStyle, 
           NSForegroundColorAttributeName: self.textColor};