2010-09-24 14 views
15

मुझे इन 2 कार्यों के बीच अंतर को समझाने के लिए एक सभ्य उत्तर नहीं मिल रहा है। प्रत्येक व्यक्ति को कब बुलाया जाता है, और दूसरा एक दूसरे को कैसे अलग करता है?बनाम लेआउटआउटव्यूस - एनएसवी व्यू - कोको टच

उदाहरण के लिए, क्या मैं सिर्फ मेरे विचारों को सही के अंदर लेआउट नहीं कर सकता?

धन्यवाद

उत्तर

56

-layoutSubviews-layoutIfNeeded से कहा जाता है यदि ध्वज स्थापित किया गया था "की जरूरत लेआउट" (-setNeedsLayout का उपयोग कर दे सकते हैं, या स्वचालित रूप से जब दृश्य सीमा बदलती है)। को अपने दृश्य [संपादित करने के लिए इसका उपयोग करें:सबव्यू] की स्थिति के लिए इसका उपयोग करें।

-drawRect:-displayIfNeeded से कहा जाता है, तो "की जरूरत प्रदर्शन" ध्वज (-setNeedsDisplay का उपयोग कर, या स्वचालित रूप से आप view.contentMode = UIViewContentModeRedraw निर्धारित करते हैं) का गठन किया गया है।

-layoutIfNeeded और -displayIfNeeded दोनों को स्क्रीन पर खींचे जाने से पहले UIKit/CoreAnimation द्वारा स्वचालित रूप से कॉल किया जाता है; आपको शायद ही उन्हें सीधे कॉल करने की आवश्यकता है।

आप -drawRect: में अपने subviews स्थित कर सकते हैं (आप भी subviews जोड़ सकते हैं!), लेकिन यह बुद्धिमानी नहीं है:

  • डिफ़ॉल्ट रूप से, -setNeedsDisplay नहीं एक सीमा परिवर्तन पर स्वचालित रूप से कहा जाता है।
  • कार्यान्वयन -drawRect: प्रदर्शन को कम करता है (UIKit/CoreAnimation को आपके लिए बिटमैप-समर्थित ग्राफिक्स संदर्भ बनाना है); केवल तभी ऐसा करें जब आपको कस्टम ड्राइंग करने की आवश्यकता हो।
  • आपको -drawRect: में दृश्य को फिर से निकालना होगा। ड्राइंग महंगा है। चारों ओर घूमने के विचार सस्ते है।
  • UIKit/CoreAnimation संभवतः एक ड्राइंग पास के बाद एक लेआउट पास करता है। CoreAnimation यह निर्धारित करने के लिए लेआउट जानकारी का उपयोग कर सकता है कि किन विचारों को चित्रित करने की आवश्यकता है (उदाहरण के लिए यह अपारदर्शी सबव्यूज़, ऑफ-स्क्रीन दृश्य, या क्लिप के सीमाओं के बाहर सबव्यूव्स द्वारा बहिष्कृत दृश्यों को अनदेखा कर सकता है। याबाउंड्स = YES व्यू; या यह केवल एक उप-रेक्ट खींच सकता है बड़ा दृश्य)। यदि आप ड्राइंग पास के दौरान विचारों को स्थानांतरित करते हैं, तो कोरएनीमेशन उन्हें सही तरीके से नहीं खींच सकता है।

संपादित करें: और कुछ और अधिक विस्तार जब मैं जाग रहा हूँ:

"प्रदर्शन" और "आकर्षित" के बीच अंतर क्या है? प्रदर्शित करना -[CALayer display] द्वारा किया जाता है; डिफ़ॉल्ट कार्यान्वयन (लगभग)

  • परत की प्रतिनिधि -displayLayer: का जवाब है, तो फोन [self.delegate displayLayer:self] है।-displayLayer: (जैसे) एक CGImage को layer.content,
  • स्थापित करने के लिए अन्यथा, अगर परत के प्रतिनिधि -drawLayer:inContext: का जवाब है, एक बिटमैप समर्थित संदर्भ की स्थापना की, [self.delegate drawLayer:self inContext:context] कहते हैं, और (layer.content के उत्पादन को बचाने के उत्पादन वास्तव में एक CABackingStore है माना जाता है , जो संभवतः एक निजी एपीआई है)
  • अन्यथा, layer.content को न बदलें।

देखने के लिए, परत की प्रतिनिधि है, इसलिए आप -[MyView displayLayer:] बजाय लागू कर सकते हैं, और एक नो-सेशन (जो मोटे तौर पर क्या UIImageView करता है) की तरह

  • self.layer.contents = (id)([UIImage imageNamed:@"foo"].CGImage) दिलचस्प चीजें करते
  • , को रोकने के लिए कोई भी "ड्राइंग"। यह उपयोगी हो सकता है यदि आपने उप-वर्गीकृत किया है उदा। UIToolbar और इसे एक पारदर्शी पृष्ठभूमि देना चाहते हैं। (यह CGContext/CABackingStore के निर्माण को भी रोकता है।)
  • निष्पादन दंड के बिना सबव्यू ले जाएं (लेकिन यह अभी भी उपरोक्त कारणों के लिए एक अच्छा विचार नहीं है)।
+0

ग्रेट उत्तर। धन्यवाद! – Idan

-2

शायद मैं सभी जवाब नहीं है, लेकिन मैं आप कह सकते हैं कि: - जब दृश्य फ्रेम बदल गया है layoutSubviews कहा जाता है - drawRect कहा जाता है जब setNeedDisplay

कहा जाता है अधिकांश समय आप layoutSubviews का उपयोग नहीं करेंगे।

दूसरों मामलों हो सकता है, लेकिन यह आप जवाब ^^

गुड लक का पहला टुकड़ा

+0

कृपया अपने दावे के चारों ओर अधिक जानकारी दें कि "अधिकांश समय आप लेआउटसव्यूव्यू का उपयोग नहीं करेंगे।" –