2012-02-09 16 views
13

रीफ्रेश/पुनः लोड करने का सबसे अच्छा तरीका मेरे पास एक तरीका है जो मेरे स्क्रॉलव्यू में कुछ सबव्यूज़ (छवियों/बटन) जोड़ता है।UIScrollView

बात यह है कि स्क्रॉलव्यू के बाहर से उपयोगकर्ता एक बटन टैप कर सकता है जो स्क्रॉलव्यू की सामग्री को बदल देगा।

वहाँ scrollview बेहतर की तुलना में "रीसेट" करने के लिए किसी भी सभ्य तरीका है:

for (UIView * view in myScrollView.subViews) { 
    [view removeFromSuperview]; 
} 

ध्यान दें कि यह समाधान किसी भी अवांछित दृश्य हटाने पर scrollview

उत्तर

19

कॉलिंग setNeedsDisplay सिर्फ आपके स्क्रॉल व्यू को फिर से निकालने जा रहा है, वास्तव में इसके अंदर की सामग्री को नहीं हटाएगा।

जैसा कि आपने पाया है, सभी स्क्रॉल व्यू सबव्यूज़ पर removeFromSuperview पर कॉल करने से परिणामस्वरूप आपके स्क्रॉल बार कभी-कभी हटाए जा सकते हैं (महान नहीं)।

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

for (UIView *view in self.contentView.subviews) 
{ 
    if (![view isKindOfClass:[UIImageView class]]) 
     [view removeFromSuperview]; 
} 

क्योंकि स्क्रॉल बार खुद को कर रहे हैं एक UIImageView उपवर्ग यह उन्हें नहीं निकाला जाएगा:

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

मेरे पहले दृष्टिकोण के साथ जाने के लिए बहुत बेहतर है और आपके द्वारा जोड़े गए सभी विचारों के साथ बस एक सरणी रखें।

+0

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

0

पर स्थिति का संकेत करने पट्टी को हटा (जो मुझे लगता है कि आप चारों ओर काम करने में सक्षम नहीं होंगे) अगले ड्राइंग चक्र पर UIScrollView को रीफ्रेश करने के लिए [myScrollView setNeedsDisplay]; पर कॉल करें।

+0

और फोन करके UIScrollView की सामग्री के आकार को अद्यतन करने के लिए मत भूलना '[myScrollView setContentSize: आकार];' कॉल करने से पहले '[myScrollView setNeedsDisplay];' या '[myScrollView setNeedsLayout];' –

+2

यह देख SO प्रश्न: http://stackoverflow.com/questions/2156015/iphone-remove-all-subviews जहां इसे '[[myScrollView सबव्यूज़] makeObjectsPerformSelector का उपयोग करने का सुझाव दिया गया है: @selector (removeFromSuperview)]; 'सरलीकृत तरीके के रूप में सभी सबव्यूव को हटा रहा है। –

+0

* मुझे अभी यह एहसास हुआ है: "ध्यान दें कि यह समाधान स्क्रॉलव्यू पर स्थिति को इंगित करने के लिए बार को हटा देता है" * ... क्यों UIScrollView को UIView के अंदर न रखें, और बस UIScrollView को हटाएं और एक नया बनाएं और दोबारा दोहराएं यह? (यदि आप वैसे भी सभी सबव्यूव को हटाने की योजना बना रहे हैं) –

2

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

3

यह एक पुरानी धागे की तरह है, लेकिन एक से थोड़ा आसान तरीका बस के लिए एक टैग को जोड़ने के लिए हो सकता है दृश्य के अपने UIScrollView में जोड़ने से, चलो 15. कहना तो

for (UIView * view in _scrollView.subviews) { 
    if (view.tag == 15) { 
     [view removeFromSuperview]; 
    } 
} 

इस तरह से आप हो सकता है चलो सुनिश्चित करें कि केवल आपके द्वारा जोड़े गए दृश्य को हटा दिया गया है। बस एक विचार।

1

स्क्रॉलबार को छोड़कर मैंने सभी सबव्यूव को हटाने के लिए यहां क्या किया है, मैंने सभी सबव्यूव को हटा दिया है जिसमें frame.size.width 10 से अधिक है, स्क्रॉलबार चौड़ाई 10 से छोटी है, इसलिए इसे हटाया नहीं जाएगा। यह मान लिया गया है सभी दृश्यों कि आप UIScollView में जोड़ने के लिए एक चौड़ाई है कि अधिक से अधिक 10.

for (UIView * view in view.subviews) { 
    if(view.frame.size.width > 10){ // removes all component except scrollbar 
     [view removeFromSuperview]; 
    } 
} 
0

आप इस लाइनों से पहले शुरू स्क्रॉल विधि, यह बस scrollview सभी डेटा निकाल रहा है स्थापित करने के लिए और अपने विधि scrollview के अनुसार होगा रीसेट।

 NSArray* subviews = [[NSArray alloc] initWithArray: Main_Scroll.subviews]; 
     for (UIView* view in subviews) 
     { 
      if ([view isKindOfClass:[UIView class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UIImageView class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UIButton class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UILabel class]]) 
      { 
       [view removeFromSuperview]; 
      } 
     }