2010-05-12 14 views
11

मैंने एक UITableView को एक कस्टम UIView क्लास के लिए एक सबव्यूव के रूप में जोड़ा जो मैं काम कर रहा हूं। हालांकि मैंने देखा कि जब भी मैं टेबल को स्क्रॉल करता हूं तो यह मेरे वर्ग लेआउटसब्यूव्यूज़ को कॉल करता है। मुझे यकीन है कि यह यूआईएसक्रोलव्यू है कि तालिका विरासत में है जो वास्तव में ऐसा कर रही है लेकिन यह जानना चाहती थी कि क्या इस कार्यक्षमता को अक्षम करने का कोई तरीका है और यदि ऐसा क्यों नहीं हो रहा है? मुझे समझ में नहीं आता है कि जब आप स्क्रॉलव्यू स्क्रॉल करते हैं तो इसे इसके सबव्यूज़ लेआउट के लिए अपने पर्यवेक्षक की आवश्यकता होती है।UIScrollview कॉलिंग पर्यवेक्षण लेआउट स्क्रॉल करते समय सबव्यूव्यूज़?

कोड:

@implementation CustomView 
- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     self.clipsToBounds = YES; 

     UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0, 15.0, 436.0, 132.0) style:UITableViewStylePlain]; 
     tableView.dataSource = self; 
     tableView.delegate = self; 
     tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 
     tableView.backgroundColor = [UIColor clearColor]; 
     tableView.showsVerticalScrollIndicator = NO; 
     tableView.contentInset = UIEdgeInsetsMake(kRowHeight, 0.0, kRowHeight, 0.0); 
     tableView.tag = componentIndex; 

     [self addSubview:tableView]; 
     [tableView release]; 
    } 
    return self; 
} 
- (void)layoutSubviews { 
    // This is called everytime I scroll the tableview 
} 

@end 

+0

लेकिन मुझे बताओ क्यों आप ऐसा क्या किया तुम क्यों जोड़ रहे हैं कस्टम दृश्य के लिए टेबल दृश्य? – Manjunath

+0

लंबी कहानी, मैं एक कस्टम पिकर व्यू बना रहा हूं जो एकाधिक चयन की अनुमति देता है और मानक एक से अलग आकार का होता है। यह मूल रूप से शीर्ष – marchinram

+0

पर एक स्पष्ट तालिका के साथ परिवर्तित एक पिकरव्यू पृष्ठभूमि प्रदर्शित करता है क्या आपने इसे देखा है? उस लेआउट में लड़के को विपरीत समस्या दिखाई देती है, दृश्यवृत्त नहीं कहा जाता है। उन्होंने एक फिक्स का भी उल्लेख किया, जो कि यदि आप इसे उलटा करते हैं, तो आपके लिए काम कर सकता है। :) http://stackoverflow.com/questions/728372/when-is-layoutsubviews-called – Kalle

उत्तर

2

हां, जब भी यह स्क्रॉल करता है तो UIScrollView लेआउटव्यूव्यूज़ को कॉल करता है। मैं शपथ ले सकता था कि यह कहीं दस्तावेज में कहा गया था, लेकिन मुझे नहीं लगता।

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

क्या कोई कारण है कि लेआउटव्यूव्यूज कहलाता है या नहीं?

+0

नहीं, मैं वहां कुछ कोड चला रहा था कि मुझे नहीं चलना चाहिए था, यह समझ में आता है कि स्क्रॉलव्यू – marchinram

+2

में स्थिति बदलने पर यह सबव्यूज़ बताता है कि आप सही हैं, लेकिन वास्तविक समस्या क्या एक स्क्रॉल व्यू स्क्रॉल करना 'लेआउटस्यूव्यूव्यू' को अपने * पर्यवेक्षण * में ट्रिगर करता है, जो महंगा और अनावश्यक दोनों हो सकता है। मुझे संदेह है कि स्क्रॉल व्यू की सीमाओं को बदलने का दुष्प्रभाव है, लेकिन यह भी एक बग हो सकता है। – Costique

0

सुनिश्चित नहीं हैं कि मैं आपकी समस्या का सही ढंग से स्मृति से नहीं दिखाया कोशिकाओं और उन्हें लोड फिर से समझते हैं लेकिन जब आप एक tableview स्क्रॉल उसे निकाल देता है, जब वे दृश्यता में वापस स्क्रॉल कर रहे हैं (कोशिकाओं को मांग पर आवंटित किया जाता है, केवल दृश्यमान होते हैं), असल में ऐसा करने के लिए जो आप वर्णन कर रहे हैं।

1

UITableView कम से कम अपने पर्यवेक्षण को लेआउट में दिखाई देता है। यह व्यवहार समस्याग्रस्त हो सकता है जब आपके पास कोई लेआउटसव्यूव्यू विधि हो जो महंगा हो (उदाहरण के लिए यदि आप कुछ जावास्क्रिप्ट को कॉल करते हैं)।

त्वरित फ़िक्स एक मध्यवर्ती सबव्यूव जोड़ता है जो स्क्रॉल व्यू को आपके पर्यवेक्षण को प्रस्तुत करने से रोकता है। इसके बजाय, यह मध्यवर्ती सबव्यू लेआउट ले जाएगा।

यह कुछ हद तक अपूर्ण हो सकता है, लेकिन यह ज्यादातर मामलों के लिए काम करना चाहिए:

मान लें UIView * intermediateView एक उदाहरण चर के रूप में परिभाषित किया गया है:

-(id) initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame: frame]; 
    if (self) 
    { 
     UIScrollView * theScrollView; // = your scroll view or table view 
     intermediateView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; 
     // Ensures your intermediate view will resize its subviews. 
     intermediateView.autoresizesSubviews = YES; 

     // Ensure when the intermediate view is resized that the scroll view 
     // is given identical height and width. 
     theScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
             UIViewAutoresizingFlexibleHeight; 
     [intermediateView addSubview: theScrollView]; 

     // Ensure the frame of the scroll view is exactly the bounds of your 
     // intermediate view. 
     theScrollView.frame = bottomContainerView.bounds; 
     [self addSubview: intermediateView]; 
    } 
    return self; 
} 

-(void) layoutSubviews 
{ 
    intermediateView.frame = CGRectMake(0, 50, 42, 42); // replace with your logic 
} 
संबंधित मुद्दे