2012-12-04 104 views
15

我需要在viewDidLoad上始终显示一个滚动条,以便用户能够理解有内容需要滚动。我做了以下内容:使滚动条在UIScrollView上始终可见?

[myscrollView flashScrollIndicators]; 

但随后的滚动条只出现viewDidLoad中一段时间​​后,只有再次消失,当用户触摸屏幕再次出现..

我需要滚动条始终可见。我该怎么做?

+0

Cudnt了解你,滚动显示是否触摸?另外滚动条如何消失?你有没有放一个计时器,或者你打算去下一个视图然后回来? – IronManGill

+0

是滚动视图出现在touch.when我使用[myscrollView flashScrollIndicators];它们出现在viewLoad上,然后在几秒钟后消失了。我想让它们一直可见..不,我不会来回走动。 – Honey

+0

检查了这一点 http://stackoverflow.com/questions/3290813/uiscrollview-indicator-always-show – Divya

回答

16

苹果间接地阻止不断在他们的iOS Human Interface Guidelines显示滚动指标,但指导原则是只为一个理由指引,他们不没有考虑到每种情况,有时你可能需要礼貌地忽视它们。

任何内容视图的滚动指标都是UIImageView这些内容视图的子视图。这意味着可以访问一个UIScrollView的滚动指标作为你将任何其另一子视图(即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定义了一个类别,用于定义alpha属性的自定义设置器。这是可行的,因为在UIScrollView的底层代码的某个时刻,它会将其滚动指示器的alpha属性设置为0以隐藏它。此时,它将贯穿我们的类别,并且如果托管UIScrollView具有正确的标记,则它将忽略正在设置的值,并将其显示。

为了使用此解决方案,请确保您的UIScrollView具有适当的标签,例如 Tag

如果您希望从其UIScrollView可见的时刻开始显示滚动指示器,只需在视图出现时闪动滚动指示器即可.e。摹

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

其他SO引用:

+0

它真的很有魅力。感谢你的回答。 – Gypsa

+0

我会说这依赖于一个私有的实现细节(指标是'UIImageView'对象),这可能并不总是如此。事实上,当你最不期待的时候,它通常会在一个新的iOS版本上崩溃。所以如果你确实使用这个,请记住你的里程可能会有所不同。 – lxt

+1

它不适用于iOS7 .. –

0

我不知道这是否会起作用。但只是给你一个提示。

Scrollview内的滚动条是一个Imageview。这是UIScrollview的子视图

因此,获取UIscrollview的滚动条Imageview。然后尝试设置图像属性隐藏NO或更改的Alpha值

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

其实在你给我的例子检查了它。它是关于改变滚动条的颜色。但我需要它们不断显示在我认识的视图 – Honey

+0

视图.. jst提示得到这个观点。既然你得到了滚动条对象,只需通过调整隐藏属性或alpha值来操纵它,这样它就会一直显示出来。 – iPrabu

+0

我试过隐藏property.but那不工作..可以ü请告诉我如何使用alpha值做它? – Honey

3

我想提供我的解决方案。我不喜欢最流行的变体与类别(在类别中重写方法可能是一些不确定的原因,应该在运行时调用什么方法,因为有两个方法具有相同的选择器)。 我使用改头换面。而且我也不需要使用标签。

此方法添加到您的视图控制器,在那里你(在我的情况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

使用iOS 10,这可以工作。如果你想设置水平滚动条,使用:UIViewAutoresizing.flexibleTopMargin(Swift 3.0)或UIViewAutoresizingFlexibleTopMargin(Obj-C) –

+1

在iOS 11中工作得很好。需要#include 。 – Smartcat