2013-06-16 6 views
13

Ist es möglich, mit einfachen Textschatten zu zeichnen, wenn Sie die NSString UIKit-Zusätze verwenden? Ich meine, ohne Code zu schreiben, zweimal in zwei Farben zu zeichnen, wie mit verschiedenen UIKit-Klassen wie UILabel und seinen shadowColor und Eigenschaften getan werden kann, und auch ohne tatsächliche Unschärfen Schatten über CGContextSetShadow (die sehr viel teurer sein werden).Ist es möglich, Text mit Schatten mithilfe der NSString UIKit-Ergänzungen zu zeichnen?

Apple's doc for these extensions enthalten eigentlich Konstanten (ganz unten) einschließlich UITextAttributeTextShadowColor und UITextAttributeTextShadowOffset was bedeutet, dass es möglich ist, aber ich sehe keine mögliche Verwendung dieser in den tatsächlichen Methoden.

Antwort

29

Ein paar Gedanken:

  1. Die UITextAttributeTextShadow... Tasten sind für, wenn sie mit einem Textattribut Wörterbuch verwenden, zum Beispiel UIAppearance Methoden:

    NSDictionary *attributes = @{UITextAttributeTextShadowColor : [UIColor blackColor], 
              UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetMake(2.0, 0.0)], 
              UITextAttributeTextColor  : [UIColor yellowColor]}; 
    
    [[UINavigationBar appearance] setTitleTextAttributes:attributes]; 
    

    Die UITextAttributeTextShadow... Tasten sind für den Einsatz nur in den Methoden, die ein Textattributwörterbuch akzeptieren.

  2. Der nächste äquivalente Schlüssel, wenn Textstrings Zeichnung die Verwendung von zugeschrieben Strings mit dem NSShadowAttributeName Schlüssel ist:

    - (void)drawRect:(CGRect)rect 
    { 
        UIFont *font = [UIFont systemFontOfSize:50]; 
    
        NSShadow *shadow = [[NSShadow alloc] init]; 
        shadow.shadowColor = [UIColor blackColor]; 
        shadow.shadowBlurRadius = 0.0; 
        shadow.shadowOffset = CGSizeMake(0.0, 2.0); 
    
        NSDictionary *attributes = @{NSShadowAttributeName   : shadow, 
               NSForegroundColorAttributeName : [UIColor yellowColor], 
               NSFontAttributeName   : font}; 
    
        NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:@"this has shadows" attributes:attributes]; 
    
        [attributedText drawInRect:rect]; 
    } 
    

    Wenn Sie über die Leistung Hit eines Schattens Algorithmus zu tun, eine Bezier-Kurve der Lage sind besorgt Schatten, NSShadow kann jedoch darunter leiden. Aber wenn man einige Benchmarks anstellt, wirkt sich die Änderung der shadowBlurRadius dramatisch auf die Leistung aus. Zum Beispiel erreichte die Animation der Rotation eines komplexen mehrzeiligen Textes mit einem shadowBlurRadius von 10.0 auf einem langsamen iPhone 3GS eine Bildrate von 31 fps, aber die Änderung shadowBlurRadius zu 0.0 ergab eine Bildrate von 60 fps.

    Die untere Linie, mit einem Schatten Blur Radius von 0.0 eliminiert die meisten (wenn nicht alle) der Rechenaufwand eines Bézier erzeugten Schattens.

  3. FYI, erlebe ich eine ähnliche Leistungssteigerung durch den blur Wert 0.0 für CGContextSetShadow Einstellung, wie ich mit der zugeschrieben Textwiedergabe oben erfahren.

Unterm Strich, ich glaube nicht, dass Sie den Rechenaufwand von Bezier-basierten Schatten fürchten sollten, solange Sie einen Unschärferadius von 0.0 verwenden. Es würde mich nicht wundern, wenn du den Text zweimal selbst schreibst, einmal für den Schatten und einmal für die Vordergrundfarbe, vielleicht sogar ein bisschen effizienter, aber ich bin mir nicht sicher, ob der Unterschied zu beobachten sein wird. Aber ich kenne keinen API-Aufruf, der das für Sie tun wird (außer CGContextSetShadow mit blur von 0.0).

+0

Danke! Ich bin immer noch verwirrt durch das Vorhandensein dieser Schattenkonstanten am unteren Rand des [Apple Doc für NSString UIKit Additions] (http://developer.apple.com/library/ios/#documentation/uikit/reference/NSString_UIKit_Additions/Reference /Reference.html) aber das muss ein Fehler sein. Gut zu wissen, dass 0 Unschärfen nach Ihrer Erfahrung nicht ineffizient sind! – Clafou

+0

@Clafou Vielleicht befolge ich Ihre Frage nicht, aber diese Shadow-Konstanten werden für Methoden verwendet, die ein "text attribute dictionary" verwenden, wie zum Beispiel die UIAppearance-Methode, wie ich in meinem ersten Punkt dargestellt habe. Ich schätze, das spielt keine Rolle, denn ich denke nicht, dass sie für Ihre aktuelle Herausforderung nicht von Nutzen sind, aber wenn Sie jemals in "UIA-Erscheinung" kommen, werden Sie diese Konstanten verwenden. – Rob

+0

Was ich meine ist, warum dokumentiert Apple diese Textattributkonstanten auf der [NSString Zeichnungsseite] (http://developer.apple.com/library/ios/#documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference. html) (die diese Attribute nicht verwenden) statt auf der [NSAttributedString-Seite] (http://developer.apple.com/library/ios/#documentation/uikit/reference/NSAttributedString_UIKit_Additions/Reference/Reference.html) (welche verwenden sie wie in ihrem Beispielcode)? – Clafou

2

Der folgende Ausschnitt verwendet CALayer Schatten um die Ränder der Zeichen in einem UILabel hinzuzufügen:

_helloLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 30)]; 
[_helloLabel setBackgroundColor:[UIColor clearColor]]; 
[_helloLabel setTextColor:[UIColor whiteColor]]; 
[_helloLabel setTextAlignment:NSTextAlignmentCenter]; 
[_helloLabel setFont:[UIFont lightApplicationFontOfSize:30]]; 

_helloLabel.layer.shadowColor = UIColorFromRGB(0xd04942).CGColor; 
_helloLabel.layer.shadowOffset = CGSizeMake(0, 0); 
_helloLabel.layer.shadowRadius = 2.0; 
_helloLabel.layer.shadowOpacity = 1.0; 

[self addSubview:_helloLabel]; 

. . normalerweise würde dies einen Schatten um die Grenze herum hinzufügen, aber UILabel scheint diese Eigenschaften als Sonderfall zu behandeln.

+2

Danke Jasper!Ich zeichne direkt in den Grafikkontext mit Core Graphics, und die Verwendung der NSString-UIKit-Zusätze ist ziemlich praktisch. Ich erreiche etwas ähnliches wie Ihre Antwort, indem ich 'CGContextSetShadowWithColor (Kontext, CGSizeMake (1.0f, -1.0f), 0.0f, [UIColor whiteColor] .CGColor);' vor meiner Zeichnung hinzufüge, aber ich denke, das ist weniger effizient als die shadowColor/shadowOffset-Objekt, das von den Konstanten im Dokument impliziert wird. – Clafou

+0

Oh cool - ich wusste nicht, dass du auf der Zeichenebene bist. . . gute Arbeit! –

Verwandte Themen