2012-12-04 23 views
15

मुझे देखने के लिए हमेशा एक स्क्रॉलबार को दृश्यमान लोड करने की आवश्यकता है ताकि उपयोगकर्ता समझ सके कि स्क्रॉल करने के लिए सामग्री है। मैंने किया था निम्नलिखित:स्क्रॉलबार हमेशा UIScrollView पर दिखाई देता है?

[myscrollView flashScrollIndicators]; 

लेकिन तब स्क्रॉलबार केवल viewDidLoad के बाद कुछ समय के लिए दिखाई देते हैं और केवल फिर से गायब हो जाते हैं फिर से प्रकट होना उपयोगकर्ता स्क्रीन छू लेती है जब ..

मैं स्क्रॉलबार हमेशा दिखाई बनाने की जरूरत है। मैं यह कैसे कर सकता हूं?

+0

cudnt यू समझते हैं, scrollviews छूने पर दिखाई दे रहे हैं ?? स्क्रॉलबार गायब हो रहे हैं कैसे? क्या आपने टाइमर लगाया है या आप अगले दृश्य पर जा रहे हैं और फिर वापस आ रहे हैं ?? – IronManGill

+0

हाँ scrollviews touch.when मैं उपयोग [myscrollView flashScrollIndicators] पर दिख रहे हैं; वे viewLoad पर दिखाई दिया और फिर seconds.I का एक अंश के बाद गायब हो गया उन्हें alwayz दिखाई ..कोई im वापस इधर-उधर नहीं जा रहा बनाना चाहते रहे हैं। – Honey

+0

जांच यह पता http://stackoverflow.com/questions/3290813/uiscrollview-indicator-always-show – Divya

उत्तर

16

एप्पल परोक्ष रूप से उनके iOS Human Interface Guidelines में स्क्रॉल संकेतक प्रदर्शित लगातार हतोत्साहित लेकिन दिशा निर्देशों सिर्फ एक कारण के लिए दिशा निर्देश हैं, वे डॉन प्रत्येक परिदृश्य के लिए खाता नहीं है और कभी-कभी आपको विनम्रतापूर्वक उन्हें अनदेखा करने की आवश्यकता हो सकती है।

किसी भी सामग्री दृश्य के स्क्रॉल संकेतक UIImageView उन सामग्री दृश्यों के सबूत हैं। इसका मतलब यह है कि आप कर सकते पहुँच एक UIScrollView की पुस्तक संकेतक आप उसके अन्य subviews (अर्थात myScrollView.subviews) और के किसी भी रूप में स्क्रॉल संकेतक को संशोधित करेगा जैसे आप किसी भी UIImageView (जैसे scrollIndicatorImageView.backgroundColor = [UIColor redColor];)।

#define noDisableVerticalScrollTag 836913 
#define noDisableHorizontalScrollTag 836914 

@implementation UIImageView (ForScrollView) 

- (void) setAlpha:(float)alpha { 

    if (self.superview.tag == noDisableVerticalScrollTag) { 
     if (alpha == 0 && self.autoresizingMask == UIViewAutoresizingFlexibleLeftMargin) { 
      if (self.frame.size.width < 10 && self.frame.size.height > self.frame.size.width) { 
       UIScrollView *sc = (UIScrollView*)self.superview; 
       if (sc.frame.size.height < sc.contentSize.height) { 
        return; 
       } 
      } 
     } 
    } 

    if (self.superview.tag == noDisableHorizontalScrollTag) { 
     if (alpha == 0 && self.autoresizingMask == UIViewAutoresizingFlexibleTopMargin) { 
      if (self.frame.size.height < 10 && self.frame.size.height < self.frame.size.width) { 
       UIScrollView *sc = (UIScrollView*)self.superview; 
       if (sc.frame.size.width < sc.contentSize.width) { 
        return; 
       } 
      } 
     } 
    } 

    [super setAlpha:alpha]; 
} 

@end 

जो मूल रूप से this source को श्रेय दिया जाता है:

सबसे लोकप्रिय समाधान निम्नलिखित कोड प्रतीत होता है।

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

इस समाधान का उपयोग करने के लिए सुनिश्चित करें कि आपके UIScrollView में उचित टैग है। Tag

यदि आप UIScrollView पल से स्क्रॉल संकेतक को प्रदर्शित करना चाहते हैं तो दृश्य दिखाई देने पर स्क्रॉल संकेतक को बस फ्लैश दिखाई दे रहा है।जी

- (void)viewDidAppear:(BOOL)animate 
{ 
    [super viewDidAppear:animate]; 
    [self.scrollView flashScrollIndicators]; 
} 

अतिरिक्त अतः संदर्भ:

+0

यह वास्तव में एक आकर्षण की तरह काम करता है। जवाब के लिए धन्यवाद। – Gypsa

+0

मैं यह कहकर यह कहूंगा कि यह एक निजी कार्यान्वयन विस्तार पर निर्भर करता है (कि संकेतक 'UIImageView' ऑब्जेक्ट्स हैं) जो हमेशा सत्य नहीं हो सकते हैं। असल में, यह सोड का कानून है कि जब आप कम से कम एक नई आईओएस रिलीज पर इसे कम से कम उम्मीद करते हैं तो यह हमेशा टूट जाएगा। तो यदि आप इसका उपयोग करते हैं, तो ध्यान रखें कि आपका लाभ भिन्न हो सकता है। – lxt

+1

यह आईओएस 7 पर काम नहीं कर रहा है .. –

0

मुझे नहीं पता कि यह काम करेगा या नहीं। लेकिन सिर्फ तुम्हारे लिए एक संकेत है।

स्क्रॉलव्यू के अंदर स्क्रॉलबार एक छविदृश्य है। जो UIScrollview

का सबव्यूव है, इसलिए UIscrollview के स्क्रॉलबार छविदृश्य प्राप्त करें। फिर उस छवि को संपत्ति नहीं या बदलें अल्फा मूल्य को छिपा सेट करने का प्रयास

static const int UIScrollViewHorizontalBarIndexOffset = 0; 
static const int UIScrollViewVerticalBarIndexOffset = 1; 
-(UIImageView *)scrollbarImageViewWithIndex:(int)indexOffset 
{ 
    int viewsCount = [[yourScrollview subviews] count]; 
    UIImageView *scrollBar = [[yourScrollview subviews] objectAtIndex:viewsCount - indexOffset - 1]; 
    return scrollBar; 
} 

-(void) viewDidLoad 
{ 
    //Some Code 
    //Get Scrollbar 
    UIImageView *scrollBar = [self scrollbarImageViewWithIndex: UIScrollViewVerticalBarIndexOffset]; 

    //The try setting hidden property/ alpha value 
    scrollBar.hidden=NO; 
} 

गॉट संदर्भ से here

+0

उदाहरण में वास्तव में यू दे दी है मैं इसे out.It जाँच कर ली है scrollbars.But के रंग को बदलने के बारे में है कि मैं उन्हें देखने – Honey

+0

मुझे पता है पर लगातार (हमेशा दिखाई) प्रदर्शित करने के लिए की जरूरत है .. एक संकेत JST उस दृश्य को पाने के लिए। चूंकि आपको स्क्रॉलबार ऑब्जेक्ट मिलता है .. छुपे हुए संपत्ति या अल्फा मान को समायोजित करके बस इसके साथ हेरफेर करें .. ताकि यह हर समय दिखाया जा सके। – iPrabu

+0

मुझे लगता है कि property.but छिपा के लिए working..Can यू कृपया मुझे यह कैसे अल्फा मूल्य का उपयोग कर रहा है कर सकते हैं बता नहीं कर रहा है की कोशिश की? – Honey

3

मैं अपने समाधान की पेशकश करना चाहते हैं। मैं के साथ श्रेणी में सबसे लोकप्रिय संस्करण पसंद नहीं है (श्रेणी में अधिभावी तरीकों कुछ indetermination क्या विधि क्रम में बुलाया जाना चाहिए के कारण हो सकता है, के बाद से वहाँ है एक ही चयनकर्ता के साथ दो तरीकों)। मैं इसके बजाय swizzling का उपयोग करें। और मुझे टैग का उपयोग करने की आवश्यकता नहीं है।

आपके विचार नियंत्रक, जहाँ आप (मेरे मामले में self.categoriesTableView) दृश्य स्क्रॉल है करने के लिए इस विधि जोड़ें

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // Do swizzling to turn scroll indicator always on 
    // Search correct subview with scroll indicator image across tableView subviews 
    for (UIView * view in self.categoriesTableView.subviews) { 
     if ([view isKindOfClass:[UIImageView class]]) { 
      if (view.alpha == 0 && view.autoresizingMask == UIViewAutoresizingFlexibleLeftMargin) { 
       if (view.frame.size.width < 10 && view.frame.size.height > view.frame.size.width) { 
        if (self.categoriesTableView.frame.size.height < self.categoriesTableView.contentSize.height) { 
         // Swizzle class for found imageView, that should be scroll indicator 
         object_setClass(view, [AlwaysOpaqueImageView class]); 
         break; 
        } 
       } 
      } 
     } 
    } 
    // Ask to flash indicator to turn it on 
    [self.categoriesTableView flashScrollIndicators]; 
} 

इस मामले में नया वर्ग

@interface AlwaysOpaqueImageView : UIImageView 
@end 

@implementation AlwaysOpaqueImageView 

- (void)setAlpha:(CGFloat)alpha { 
    [super setAlpha:1.0]; 
} 

@end 

स्क्रॉल सूचक (लंबवत स्क्रॉल सूचक जोड़े) हमेशा स्क्रीन पर होगा।

+0

आईओएस 10 का उपयोग करके, यह काम करता है। यदि आप क्षैतिज स्क्रॉल बार का उपयोग करना चाहते हैं: UIViewAutoresizing.flexibleTopMargin (स्विफ्ट 3.0) या UIViewAutoresizingFlexibleTopMargin (Obj-C) –

+1

आईओएस 11 में बहुत अच्छा काम किया। # शामिल की आवश्यकता है। – Smartcat