2011-01-20 4 views
8

मैं जो चाहता हूं वह एक भरे आयत को लेना और दूसरे आकार का उपयोग करके इसमें एक छेद पंच करना है। यह बिल्कुल ऐसी चीज है जो NSBezierPath के लिए डिज़ाइन की गई है। आप एक आयताकार पथ जोड़ते हैं, फिर उपपथ जोड़ें जो इसके माध्यम से "पंच" करेगा और अंत में इसे भर देगा। मेरे मामले में उपपथ वास्तव में पाठ है। जब मैं का उपयोग अपने फ़ॉन्ट के लिए Helvetica Neue बोल्ड छोड़करएनएसबीज़ियरपाथ में हेल्वैटिका नियू बोल्ड ग्लाइफ एक सामान्य उपपथ के रूप में क्यों नहीं खींचेगा?

alt text

: कोई बात नहीं, महान काम करता है। जब मैं इसका उपयोग करता हूं, तो मैं बिना किसी पाठ के ठोस नीले आयताकार के साथ समाप्त होता हूं। लेकिन सब-पाथ वास्तव में आ रहा है - वास्तव में, अगर मैं भरा आयत थोड़ा हटना, आप वास्तव में पाठ पथ के कुछ देख सकते हैं:

alt text

मैं Helvetica Neue इटैलिक के साथ समान व्यवहार मिलता है। हेल्वेटिका नियू माध्यम ठीक काम करता है, जैसा हेल्वेटिका बोल्ड, टाइम्स न्यू रोमन बोल्ड और एरियल बोल्ड करता है।

मैंने NSEvenOddWindingRule और NSNonZeroWindingRule दोनों का उपयोग करने का प्रयास किया है। (संपादित: जाहिर है मैं वास्तव में, NSEvenOddWinding शासन की कोशिश नहीं की, क्योंकि वह बाहर बारी है सब के बाद काम करने के लिए)

इस कोड है कि मैं अपने NSView उपवर्ग के drawRect विधि के अंदर उपयोग कर रहा हूँ है।

NSLayoutManager *layoutManger = [[[NSLayoutManager alloc] init] autorelease]; 
NSTextContainer *textContainer = [[[NSTextContainer alloc] 
     initWithContainerSize:NSMakeSize(300, 100)] autorelease]; 

NSFont *font = [NSFont fontWithName:@"Helvetica Neue Bold" size:100]; 

NSDictionary *textAttribs = [NSDictionary dictionaryWithObjectsAndKeys: 
         font, NSFontAttributeName, nil]; 

NSTextStorage *textStorage = [[[NSTextStorage alloc] initWithString:@"Hello" 
             attributes:textAttribs] autorelease]; 

[layoutManger addTextContainer:textContainer]; 
[layoutManger setTextStorage:textStorage]; 

NSRange glyphRange = [layoutManger glyphRangeForTextContainer:textContainer]; 

NSGlyph glyphArray[glyphRange.length]; 

NSUInteger glyphCount = [layoutManger getGlyphs:glyphArray range:glyphRange]; 

NSBezierPath *path = [NSBezierPath bezierPathWithRect:NSMakeRect(0, 0, 200, 100)]; 
[path appendBezierPathWithGlyphs:glyphArray count:glyphCount inFont:font]; 

[[NSColor blueColor] setFill]; 

[path fill]; 

तो यहां क्या हो रहा है? जब पथ में ग्लिफ जोड़ने की बात आती है तो कुछ फ़ॉन्ट्स दूसरों की तुलना में अलग-अलग व्यवहार क्यों करते हैं?

EDIT: समाधान NSEvenOddWindingRule का उपयोग करना है।

[path setWindingRule:NSEvenOddWindingRule]; 

पीटर Hosey का जवाब क्यों है का विवरण प्रदान करता है: path के निर्माण के बाद इस लाइन को जोड़ने।

+0

मुझे आश्चर्य है कि क्या हेल्वैटिका नियू एक अलग प्रकार का फ़ॉन्ट है। –

उत्तर

4

शायद यह फ़ॉन्ट्स के पथों के निर्देशों के साथ करना है। एक फ़ॉन्ट घड़ी के रास्ते का उपयोग कर सकते हैं; दूसरा काउंटरक्लॉक पथ का उपयोग कर सकता है।

आपके प्रभाव के बाद प्राप्त करने के लिए एक और अधिक विश्वसनीय तरीका आयत को भरना होगा, और फिर ग्राफिक्स संदर्भ के कंपोजिटिंग मोड के साथ NSCompositeSourceOut पर टेक्स्ट को खींचें। कोर ग्राफिक्स का उपयोग करके आप पारदर्शिता परत में भरने और टेक्स्ट-ड्रा को लपेट सकते हैं यदि आप केवल भरने के पाठ को काटना चाहते हैं।

+0

शानदार, धन्यवाद। हेल्वैटिका नियू बोल्ड के लिए भी, यह समाधान मेरे उपयोग के मामले के लिए बहुत अच्छा काम करता है। मैं अभी भी बहुत उत्सुक हूं कि यह वास्तव में क्यों होता है। यहां तक ​​कि एक ही फ़ॉन्ट के भीतर मतभेद लगते हैं। हेल्वेटिका नियू और हेल्वेटिका नियू बोल्ड दोनों इस भयानक व्यवहार को प्रदर्शित करते हैं, लेकिन हेल्वैटिका नियू माध्यम नहीं करता है। मुझे आशा है कि कोई वास्तव में समझा सकता है कि यह क्यों हो रहा है। मैं सभी पाठ प्रोग्रामिंग दस्तावेज़ों से गुज़र चुका हूं और उम्मीद कर रहा था कि एनएसजीलीफ जेनरेटर कुछ और जानकारी देगा, लेकिन कोई भाग्य नहीं। –

+0

@ बेन डॉल्मन: मेरे उत्तर में पहला अनुच्छेद संभावित कारण बताता है और यह फ़ॉन्ट-विशिष्ट क्यों है। –

+0

तो हेल्वेटिका नियू और हेल्वेटिका नियू माध्यम विभिन्न दिशाओं में आकर्षित करते हैं? मैं ग्लिफ ड्राइंग के बारे में बहुत कम जानता हूं, इसलिए यह मेरे लिए अजीब लगता है। वूडू मुझे कोई पसंद नहीं है। इस व्यवहार के लिए दस्तावेज़ीकरण पर कोई विचार - या यहां तक ​​कि एक वैचारिक अवलोकन - मौजूद है? कोको पाठ प्रोग्रामिंग दस्तावेज़ इस गहरी पीढ़ी पीढ़ी में नहीं लगते हैं। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^