2012-10-17 19 views
6

मेरा एप्लिकेशन कुछ साधारण आकृति के चित्र को करने में सक्षम है (जब तक मुझे एक और स्थिर कोड नहीं मिलता है, मैं केवल एक आकृति के साथ चिपक रहा हूं) और यह उन्हें फिर से आकार देने में भी सक्षम है।UIView ड्राइंग बेस्ट प्रैक्टिस

- (void)drawRect:(CGRect)rect 
{  
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    [self setContextFillColor:context]; 
    [self setContextStrokeColor:context]; 
    [self setLineWidth:context]; 

    CGFloat lineThickness = [self lineWidth] ; 
    CGFloat halfLineThickess = lineThickness/2.0f; 

    CGContextAddRect(context, CGRectMake(halfLineThickess,halfLineThickess, rect.size.width - lineThickness, rect.size.height - lineThickness)); 

    CGContextDrawPath(context, kCGPathEOFillStroke); 
} 

कौन सा मुझे देता है, (100.0f, 100.0f) की एक इनपुट आकार के साथ, इस:

enter image description here

यह आंकड़ा है कोड मैं एक UIView बनाने के लिए उपयोग निम्नलिखित है एक "कंटेनर" UIView के अंदर जो बदले में UIScrollView के अंदर है। इसके साथ मेरी समस्या यह है कि जब मैं अपनी आकृति का आकार बदल रहा हूं और मैं लगभग 1000 * 1000 के आकार तक पहुंचता हूं (मेरा "कंटेनर" 20,000 * 20,000 है), तो मुझे स्मृति चेतावनियां मिलना शुरू हो जाता है और एप्लिकेशन अंत में छोड़ देता है। तो मेरे प्रश्न हैं:

1) क्या मुझे UIView के लिए अधिकतम आकार डालने पर विचार करना चाहिए?

2) मैं इस तरह की समस्याओं को ट्रैक करने के लिए उपकरणों का उपयोग कैसे कर सकता हूं, और देख सकता हूं कि समस्या कहां आ रही है (या भारी भारोत्तोलन कहाँ किया जा रहा है)।

3) क्या मुझे this जैसे किसी प्रकार की कैशिंग का उपयोग करना चाहिए?

4) UIView ड्राइंग करते समय विचार करने के लिए कुछ सामान्य सर्वोत्तम प्रथाओं पर विचार करने के लिए हैं?

5) क्या मुझे CALayer पर विचार करना चाहिए, हालांकि मुझे स्पर्शों को सुनने की ज़रूरत है?

UIView का पुनः आकार आकार this पर आधारित है।

+0

क्या आपने क्वार्ट्जकोर का उपयोग करने पर विचार किया है और सीमा को आकर्षित करने के लिए बस अपनी दृश्य की परत संपत्ति का उपयोग कर लिया है? – runmad

+0

बात यह है: यह एक साधारण आंकड़ा है। अंत में मेरे पास अधिक जटिल होंगे, और मुझे नहीं लगता कि 'UIView' के गुणों के साथ खेलना पर्याप्त होगा। लेकिन सुझाव के लिए धन्यवाद। – Peres

+2

यदि आपको बड़ी सामग्री (शायद ज़ूम के साथ) खींचने की आवश्यकता है तो आप 'CATiledLayer' http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html – Bastian

उत्तर

1

आपको इस बड़े UIView को नहीं बनाना चाहिए। यह बहुत बड़ा है। इस तरह की समस्या है CATiledLayer पता करने के लिए डिज़ाइन किया गया है। असल में आपको अपने आकृतियों के लिए बाध्यकारी बक्से का ट्रैक रखने की आवश्यकता होगी, और उन बाध्यकारी बक्से का उपयोग करने के लिए यह पता लगाने के लिए कि कौन से टाइल्स किस आकार को छेड़छाड़ करते हैं। जब सिस्टम किसी दिए गए टाइल के लिए पूछता है, तो आप इसे आकार देने वाले सभी आकार खींचते हैं। बहुत बड़े और जटिल आकारों के लिए, आप आकार को विभाजित करके और अधिक अनुकूलित कर सकते हैं, लेकिन अक्सर इसकी आवश्यकता नहीं होती है।

1

1) मुझे लगता है कि आकार सही है, यदि आप सही दृष्टिकोण का उपयोग कर रहे हैं तो यह कोई समस्या नहीं है।

2) आप उपकरण स्मृति समस्याओं

3,4) मुझे लगता है कि - (void)drawRect:(CGRect)rect यह एक अच्छा अभ्यास नहीं है पर नज़र रखने के बारे में WWDC वीडियो पर एक नज़र डालें उपयोग करना चाहिए। यदि आप CALayer ड्राइंग पर देखेंगे तो बेहतर होगा। ड्राइंग के लिए आप कस्टम CGMutablePathRef का उपयोग कर सकते हैं।

तो UIView स्पर्शों को संसाधित करने के लिए अच्छा है लेकिन आकृतियों को चित्रित करने के लिए अच्छा नहीं है।

+0

मैं उस विशेष 'UIView' (जैसे चलती और आकार बदलने) पर जेस्चर को भी संसाधित करना चाहता हूं। – Peres

+0

@JackyBoy यह एक समस्या यहाँ नहीं है कुछ कदम है: 1) नया दृश्य बनाने 'UIView * view' 2) नई परत बनाने ' CALayer * shapeLayer view.layer = shapeLayer' 3) जोड़े इशारों '[ addGestureRecognizer देखें: panGesture]; ' – Danil

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