2012-06-10 13 views
8

मैं सबक्लास में अपने subviews को समायोजित करने का प्रयास कर रहा हूं, लेकिन मैं स्क्रॉल संकेतकों को परेशान नहीं करना चाहता हूं। इन तक पहुंचने के लिए कोई सार्वजनिक इंटरफ़ेस प्रतीत नहीं होता है और मैं यह देखना चाहता हूं कि कोई दृश्य स्क्रॉल संकेतक में से एक है या नहीं (ताकि मैं इसे अनदेखा कर सकूं)।UIScrollView के सबव्यूम की गणना करते समय स्क्रॉल संकेतक को कैसे बाहर निकालना है?

UIScrollView.h इन दो Ivars वाणी:

UIImageView* _verticalScrollIndicator; 
UIImageView* _horizontalScrollIndicator; 

... लेकिन मैं निम्नलिखित की कोशिश की और एक लिंकर त्रुटि मिली:

for(UIView* v in self.subviews) 
{ 
    // Ignore the scroll-indicator views 
    if((v == _horizontalScrollIndicator) || 
     (v == _verticalScrollIndicator)) 
    { 
     continue; 
    } 
    // View is one of mine - do stuff to it... 
} 

एप्पल जाहिर है आप इन के साथ खिलवाड़ नहीं करना चाहती है, जो मामला उन्हें कुछ चालाक करना चाहिए ताकि subviews से लौटाई गई सरणी में उन्हें शामिल न किया जाए (ऐप्पल पर आओ, यह मुश्किल नहीं है!), लेकिन तब तक मैं उन्हें कैसे अनदेखा कर सकता हूं?

उत्तर

2

संभवतः आप UIScrollView में दिए गए विचारों के नियंत्रण में हैं। क्यों न सिर्फ उन विचारों की अपनी सरणी बनाए रखें? इस तरह, आप UIScrollView के कार्यान्वयन में किसी भी भावी बदलाव के खिलाफ सुरक्षित हैं।

+0

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

+0

मैं इस पर @ कुर्ट्रेविस के साथ जाऊंगा। अपनी खुद की सरणी रखें, इसे एडस्यूब्यू ओवरराइड करके बनाए रखें: और हटाएं सबव्यूव: (जो मुझे नहीं लगता कि ओएस स्क्रॉल संकेतकों के लिए कॉल करता है)। यदि आप ऐसा नहीं करना चाहते हैं, तो ऐप्पल निर्भरताओं के साथ एक त्वरित और गंदा जवाब addSubview पर सबव्यूज़ को टैग करना है:। जब आप सबव्यूज की गणना करते हैं, तो टैग वाले लोगों को अस्वीकार करें। यहां नकारात्मकता यह है कि आप सबक्लास के उपयोगकर्ताओं के लिए टैग खराब कर देंगे, जिन्हें अकेले छोड़े गए टैग की आवश्यकता हो सकती है। अन्य समाधान मैं सोच सकता हूं कि सभी के पास ऐप्पल आंतरिक पर निर्भरता है। – danh

+0

ऐप्पल addSubView का उपयोग करता है: स्क्रॉल संकेतक जोड़ने के लिए यह व्यवहार्य नहीं है। सब कुछ जो उप-दृश्यों को ट्रैक करना चाहता है, उसे भी सम्मिलित करें: सबव्यूव: * विधियों में ट्रैक रखना चाहिए। – jhabbott

0

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

+0

दुर्भाग्यवश नहीं - वे केवल तभी जोड़े जाते हैं जब आवश्यक हो (यानी जब उपयोगकर्ता स्क्रॉलिंग शुरू करता है) और गायब होने के बाद हटा दिया जाता है। – jhabbott

+0

अहह निराशाजनक है। – jamesmoschou

1

मैं एक ही मुद्दे के खिलाफ हूं और मैं उन दोनों UIImageView के मूल्यों को देखने के बारे में सोचना शुरू कर रहा हूं ताकि यह पता चल सके या नहीं। उनके पास एक सुंदर अद्वितीय हस्ताक्षर है:

<UIImageView: 0x8ab3e00; frame = (313 812.5; 7 3.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x8ab9740>> 
<UIImageView: 0x8ab3e90; frame = (314.5 522; 3.5 341); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x8ab3f20>> 

अन्य हुकों के बीच जिन्हें आप सुन सकते हैं। आदर्श नहीं है लेकिन इस बिंदु पर विकल्पों के रास्ते में बहुत कुछ नहीं ...

एक उदाहरण है। इस मामले में, मैं स्क्रूव्यू के उप-दृश्यों के माध्यम से स्क्रॉलव्यू के उप-दृश्यों के माध्यम से स्क्रॉलव्यू के लिए इष्टतम contentSize ऊंचाई को समझने के लिए उप-दृश्यों के आधार पर लूपिंग कर रहा था, जिससे मुझे लगता है कि यह मेरे साथ खराब होने वाले स्क्रॉलबार थे। ..

CGRect contentRect = CGRectZero; 
for (UIView *view in self.myScrollView.subviews) { 
    //exclude scroll bars, the width/height is 3.5 for non-retina or 7 
    //for retina. you can put some logic in here if you like to check 
    //the appropriate 3.5/7.0 values for the respective screen densities 
    if(view.frame.size.width > 7.0f && view.frame.size.height > 7.0f) { 
     contentRect = CGRectUnion(contentRect, view.frame); 
    } 
} 
container.contentSize = CGSizeMake(container.contentSize.width, contentRect.size.height); 

यदि प्रत्येक UIView के फ्रेम की जाँच आप के लिए पर्याप्त रूप से विशिष्ट नहीं है, आप यह भी सुनिश्चित हो सकता है कि यह एक UIImageView है।

मुझे लगता है कि इस बिंदु पर यह एकमात्र "सत्य" समाधान है। मैं व्यक्तिगत रूप से विचारों की एक और श्रृंखला को बनाए रखना नहीं चाहता था।

संपादित करें:

यहाँ मेरी समेकित विधि है कि मैं का उपयोग करें:

-(bool)isProbablyAScrollBar:(UIView*)view { 
    CGFloat screenScale = [[UIScreen mainScreen] scale]; 
    return (([view isKindOfClass:[UIImageView class]]) && (view.frame.size.width <= (screenScale*3.5f) || view.frame.size.height <= (screenScale*3.5f))); 
} 
+0

साफ विचार, हालांकि हैकी और गलत हो सकता है (लेकिन कम से कम विधि का नाम यह सुझाता है)। बस सोचा कि मैं कुछ सुधारों के साथ टिप्पणी करूंगा: 1. चौड़ाई की जांच के साथ, आप जांच सकते हैं कि यह दाएं (या ऊंचाई और नीचे के पास) है। 2. फ्रेम पहले से ही अंक में मापा जाता है ताकि आपको स्क्रीन के पैमाने से गुणा नहीं करना चाहिए। – jhabbott

5

यह जा रहा है मेरे काम के आसपास

BOOL showsVerticalScrollIndicator = self.showsVerticalScrollIndicator; 
BOOL showsHorizontalScrollIndicator = self.showsHorizontalScrollIndicator; 

self.showsVerticalScrollIndicator = NO; 
self.showsHorizontalScrollIndicator = NO; 

// loop through self.subviews here 

self.showsVerticalScrollIndicator = showsVerticalScrollIndicator; 
self.showsHorizontalScrollIndicator = showsHorizontalScrollIndicator; 
0

समाप्त हो गया मेरे समाधान किया गया था:

UIView* MYContentView=[[UIView alloc] initWithRect: CGrectMake:(0,0,Scrollview.frame.size.width, scrollview.frame.size.height)]; 

[ScrollView addsubview: MYContentView]; 

तब मैं MYContentView करने के लिए सभी छवियों को जोड़ा गया है और बाद में MYContentView और

[ScrollView setContentSize:Cgsize]; 

अब आप स्क्रॉलबार के बारे में चिंता किए बिना MYContentView में सभी छवियाँ की गणना कर सकते हैं पुनः पैमाना।

कर:

while ([[MYContentView subviews] count]>0) { 
    [[[MYContentView subviews]lastObject] removeFromSuperview]; 
} 

केवल चित्र निकाला गया। उम्मीद है कि यह

0

श्री ट्रिस्टन की विधि के आधार पर मदद करता है। मुझे लगता है कि वह गलती से स्क्रीन पैमाने के साथ गुणा किया।

+ (NSArray <UIView *> *)reservedSubviewsInUIScrollView:(UIScrollView *)view 
{ 
    BOOL (^isProbablyAScrollBar)(UIView *s) = ^BOOL(UIView *s) { 
     return [s isKindOfClass:[UIImageView class]] && (s.frame.size.width <= 3.5 || s.frame.size.height <= 3.5); 
    }; 

    NSMutableArray <UIView *> *reserved = [NSMutableArray new]; 
    for(UIView *s in view.subviews) 
    { 
     if(isProbablyAScrollBar(s)) 
     { 
      [reserved addObject:s]; 
     } 
    } 
    return reserved; 
} 
संबंधित मुद्दे