2012-12-04 76 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