2009-09-21 9 views
5

मेरे पास एक कस्टम UIView है जो इसकी -[drawRect:] विधि का उपयोग करके खींचा गया है।कस्टम दृश्य में अजीब एंटी-एलाइजिंग

समस्या यह है कि एंटी-एलियासिंग बहुत अजीब काम करता है क्योंकि ब्लैक लाइन क्षैतिज या ऊर्ध्वाधर रेखाएं बहुत धुंधली होती हैं।

यदि मैं CGContextSetAllowsAntialiasing के साथ एंटी-एलाइजिंग अक्षम करता हूं, तो सब कुछ अपेक्षित के रूप में खींचा जाता है।

विरोधी एलियासिंग:
alt text http://dustlab.com/stuff/antialias.png

कोई विरोधी एलियासिंग (जो ए.ए. साथ अपेक्षित परिणाम की तरह दिखता है):
alt text http://dustlab.com/stuff/no_antialias.png

लाइन चौड़ाई वास्तव में 1 है, और सभी निर्देशांक अभिन्न मान रहे हैं ।

एक ही होता है अगर मैं एक आयत CGContextStrokeRect का उपयोग कर आकर्षित, लेकिन अगर मैं वास्तव में नहीं बना एक ही CGRectUIRectStroke साथ।

उत्तर

10

के साथ ढाले के बाद से एक स्ट्रोक दोनों पक्षों के लिए बराबर मात्रा बढ़ती है, एक पिक्सेल चौड़ाई की एक पंक्ति मिल जाएगा को एक पूर्णांक समन्वय पर नहीं रखा जाना चाहिए, लेकिन 0.5 पिक्सेल ऑफसेट पर होना चाहिए।

की गणना इस तरह stroked लाइनों के लिए सही निर्देशांक:

CGPoint pos = CGPointMake(floorf(pos.x) + 0.5f, floorf(pos.y) + 0.5f); 

Btw: अपने मूल्यों int करने के लिए और वापस फ्लोट करने के लिए दशमलव भाग से छुटकारा पाने के डाली है। सी में floor नामक सी के लिए एक फ़ंक्शन है।

+2

इसके अतिरिक्त, ऐप्पल कोको ड्रॉइंग गाइड के "पिक्सल-सटीक ड्राइंग" अनुभाग में कुछ अच्छी टिप्स और नमूना कोड प्रदान करता है: http://developer.apple.com/mac/library/documentation/Cocoa/ संकल्पनात्मक/कोकोडाउविंगगाइड/ट्रांसफॉर्म/ट्रांसफॉर्म.html # // apple_ref/doc/uid/TP40003290-CH204-BCICIJAJ –

+0

यहां किसी भी कोड के बिना किसी भी कोड से बचने का आसान तरीका है http://www.techpaa.com/2012/06/avoiding -view-edge-antialiasing.html – ShivaPrasad

+0

@jeeva 'UIViewEdgeAntialiasing' केवल परतों के किनारों के लिए है। सवाल क्वार्ट्ज में खींची गई रेखाओं के बारे में है। क्वार्ट्ज ड्राइंग 'UIViewEdgeAntialiasing' से प्रभावित नहीं है। –

0

आपके दृश्य फ़्रेम में, आपके पास शायद फ़्लोट मान हैं जो पूर्णांक नहीं हैं। फ्रेम सटीक रूप से पर्याप्त एक पिक्सेल (नाव) के भिन्न करने के लिए कर रहे हैं, तब तक आप धुंधलेपन जब तक आप किसी पूर्णांक

CGRect frame = CGRectMake((int)self.frame.bounds..., (int)...., (int)...., (int)....); 
संबंधित मुद्दे