2013-02-10 52 views
8

the documentation के अनुसार, यह CATextLayer अंदर फ़ॉन्ट समरेखण सक्षम करने के लिए संभव है:कैसे CATextLayer अपने पाठ को सुचारू बनाने के लिए?

@implementation CATextLayerWithFontSmoothing 
-(id)init { 
    self=[super init]; 
    if (self) { 
    CALayer * whiteBackground = [CALayer layer]; 
    CATextLayer * blackText = [CATextLayer layer]; 

    [whiteBackground setBounds:NSMakeRect(0, 0, 300, 300)]; 
    [blackText setBounds:NSMakeRect(0, 0, 300, 300)]; 

    [whiteBackground setBackgroundColor:[NSColor whiteColor].CGColor]; 
    [blackText setForegroundColor:[NSColor blackColor].CGColor]; 
    [blackText setString:@"CATextLayer"]; 

    [blackText setShouldRasterize:YES]; 

    [self addSublayer:whiteBackground]; 
    [self addSublayer: blackText]; 

    } 
    return self; 

जो काम नहीं करता:

Text can only be drawn using sub-pixel antialiasing when it is composited into an existing opaque background at the same time that it's rasterized.

यहाँ कैसे मैं इस वाक्य समझते हैं। पाठ उप-उपसर्ग एंटी-एलियासिंग का उपयोग करके खींचा नहीं जाता है।

+0

आप पाठ परत की पृष्ठभूमि का रंग की स्थापना की कोशिश की है पर काम कर समाधान नहीं मिला? '[ब्लैकटेक्स्ट सेटबैकग्राउंड रंग: [एनएससीओलर व्हाइटकॉलर]।CGColor] ' –

+0

@robmayoff मैं मानता हूं कि मैं पृष्ठभूमि रंग को सफेद रंग में सेट करने का प्रयास करना भूल गया हूं, लेकिन यह काम नहीं करता है, यानी यह गैर उप-पिक्सेल ए है। – alecail

+0

मैं इस समय अपने आप से काम कर रहा हूं। ऊपर दिए गए कोड के साथ कम से कम एक समस्या यह है कि आप ब्लैकटेक्स्ट परत को अपने आप में रास्टरराइज करने के लिए कह रहे हैं, जो मदद नहीं करेगा। जब आप इसे प्रस्तुत करते हैं ('setShouldRasterize:' सेट करके इसे प्रस्तुत करने के लिए आपको अपनी सुपर परतों को रास्टराइज़ करने के लिए एक सुपर लेयर बताने की आवश्यकता होती है। दस्तावेजों के उस बिट के बारे में मेरी पढ़ाई से पता चलता है कि यदि आप यह करते हैं (सुपर लेयर पर) उप -CATextLayer विरोधी परत के साथ सुपर परत में rasterised किया जाएगा। मैं बाद में परीक्षण करूँगा, जब तक कि मैं एक और दृष्टिकोण नहीं मिलता। – Benjohn

उत्तर

8

विधि वर्णित here काम करता है:

केस 2: यदि आप एक CATextLayer सीधे उपयोग कर रहे हैं, तो आप अपने ड्राइंग कोड में निम्नलिखित उपवर्ग CATextLayer करने की जरूरत है और की तरह कुछ करेंगे:

- (void)drawInContext:(CGContextRef)ctx 
{ 
CGContextSetRGBFillColor (ctx, r, g, b, a); 
CGContextFillRect (ctx, [self bounds]); 
CGContextSetShouldSmoothFonts (ctx, true); 
[super drawInContext:ctx]; 
} 

text on a regular CATextLayer

:

यहाँ बनाम गैर-समतल समतल की तुलना है

text with sub-pixel-aa

800% zoom of both layers

पुनश्च: एक CRT पर इस जवाब को देखो न करें।

2

जिस तरह से मैं इस दस्तावेज़ को समझता हूं, यह कहता है कि CATextLayerहमेशा उप-पिक्सेल एंटीअलाइजिंग को अक्षम करता है। वाक्य आप उद्धृत सिर्फ इस के लिए एक स्पष्टीकरण इसे सक्षम करने के निर्देशों के रूप में नहीं के रूप में दिया जाता है - यह द्वारा पीछा किया है: YES को परत की अस्पष्टता गुण को सेट प्रतिपादन मोड परिवर्तन नहीं करता है

... जिसका मतलब है कि भले ही आप परत के लिए एक अपारदर्शी पृष्ठभूमि का उपयोग, इस तथ्य यह है कि CATextLayer सब-पिक्सेल-आ उपयोग नहीं करता है नहीं बदलेगा।

3

देर हो सकती है। लेकिन मैं देख रहा हूँ इस सवाल स्टीव जवाब के रूप में एक आदर्श समाधान है, है, और nacho4d की टिप्पणी है कि:

How to get text in a CATextLayer to be clear

1

यदि आप ज्यादा दीवार सिर के बाद, एक मुद्दा जहां CATextLayer OSX में थोड़ा धुँधली पाठ प्रतिपादन है के लिए खोज आया पीटने , मैं ऐसा करके तेज स्पष्ट पाठ मिल गया:

text_layer.contentsScale = self.window!.backingScaleFactor 
text_layer.zPosition = 0 

(मैं भी विचारों पृष्ठभूमि परत contentsScale सेट एक ही हो)।

0

स्वीकृत उत्तर मेरे लिए काम नहीं करता है।

मैं Ignacio Nieto blog

textLayer.contentsScale = UIScreen.mainScreen().scale