2012-11-01 8 views
7

UIView उप-वर्गीकरण करते समय, मैं आमतौर पर अपने सभी प्रारंभिकरण और लेआउट कोड को init विधि में रखता हूं। लेकिन मुझे बताया गया है कि layoutSuviews ओवरराइड करके लेआउट कोड किया जाना चाहिए। SO पर post है जो बताता है जब प्रत्येक विधि को कॉल किया जाता है, लेकिन मैं जानना चाहता हूं कि अभ्यास में उनका उपयोग कैसे करें।UIView: layoutSubviews बनाम initWithFrame

मैं वर्तमान में इस तरह init विधि में अपने सभी कोड डाल दिया,:

MyLongView.m

- (id)initWithHorizontalPlates:(int)theNumberOfPlates 
{ 
    self = [super initWithFrame:CGRectMake(0, 0, 768, 1024)]; 

    if (self) { 
     // Initialization code 
     _numberOfPlates = theNumberOfPlates; 

     UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.frame]; 
     [scrollView setContentSize:CGSizeMake(self.bounds.size.width* _numberOfPlates, self.bounds.size.height)]; 
     [self addSubview:scrollView]; 

     for(int i = 0; i < _numberOfPlates; i++){ 
      UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"a1greatnorth_normal_%d.jpg", i+1]]; 
      UIImageView *plateImage = [[UIImageView alloc] initWithImage:img]; 
      [scrollView addSubview:plateImage]; 
      plateImage.center = CGPointMake((plateImage.bounds.size.width/2) + plateImage.bounds.size.width*i, plateImage.bounds.size.height/2); 
     } 

    } 
    return self; 
} 

यह हमेशा की तरह कार्य है:, दृश्य की फ्रेम सेट करते समय एक इवर initialising, की स्थापना एक स्क्रॉलव्यू अप करें, यूआईएममेज शुरू करना, उन्हें UIImageViews में रखना, उन्हें बाहर रखना।

मेरा प्रश्न है: इनमें से कौन सा init में किया जाना चाहिए, और इनमें से कौन सा layoutSubviews में किया जाना चाहिए?

उत्तर

15

आपके init आवश्यक डेटा के साथ सभी वस्तुओं को बनाना चाहिए। इनिट में आपके द्वारा पास किए गए किसी भी फ्रेम को आदर्श रूप से उनकी शुरुआती स्थिति होना चाहिए।

फिर, लेआउट के भीतर दृश्यव्यू :, आप अपने सभी तत्वों के फ्रेम को उन जगहों पर बदलने के लिए बदलते हैं जहां उन्हें जाना चाहिए। कोई alloc'ing या init'ing उनके पदों में से सिर्फ बदलते layoutSubviews में जगह ले जाना चाहिए :,, आदि आकार ...

4

मामले में आप सिर्फ autoresizingFlags, या autolayout, आप हो सकता है के साथ पूरी तरह से काम करता है autoresizing रहे हैं बस पूरे दृश्य को सेट करने के लिए init का उपयोग करें।

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

जैसा कि डब्लूडीयूके द्वारा उल्लिखित है, सभी प्रारंभिक कोड/ऑब्जेक्ट सृजन आपके इनिट विधि या कहीं भी होना चाहिए, लेकिन लेआउटस्यूब्यूज में नहीं होना चाहिए।

+2

मैं इसे और नीचे दबा दूंगा। Init के बजाय 'viewDidLoad' में अपनी सबव्यू ऑब्जेक्ट बनाएं। विचार आलसी लोड हो जाते हैं, और अगर पर्यवेक्षण नहीं किया जा रहा है तो सबव्यूव्यू बनाने का कोई कारण नहीं है। – Abizern

+9

हम यहां विचारों के बारे में बात कर रहे हैं, न कि ViewController। – calimarkus

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