2012-12-04 136 views
15

私はスクロールバーを常にviewDidLoadに表示して、スクロールするコンテンツがあることをユーザーに理解させる必要があります。私は、次のことをやった:UIScrollViewでスクロールバーを常に表示できますか?

[myscrollView flashScrollIndicators]; 

しかし、その後、スクロールバーが唯一のviewDidLoad後もしばらく表示され、ユーザが画面に触れたときにのみ再び現れ、再び消える...

私はスクロールバーが常に表示されるようにする必要があります。どうしたらいいですか?

+0

Cudntはあなたに触れているのですか?また、スクロールバーはどのように消えていますか?タイマーを入れてもらうか、次のビューに行くと戻ってくるのですか? – IronManGill

+0

はい、私は[myscrollView flashScrollIndicators]を使用してtouch.whenにスクロールビューが表示されています。彼らはviewLoadに現れ、数秒後に姿を消しました。私はそれらをalwayzに見せたいと思います。 – Honey

+0

これをチェックしてください http://stackoverflow.com/questions/3290813/uiscrollview-indicator-always-show – Divya

答えて

16

アップルから値

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; 
} 

ガットの参照が間接的にiOS Human Interface Guidelinesにスクロールインジケータを表示絶えず思いとどまらが、ガイドラインは、彼らドン、その理由のためだけのガイドラインですすべてのシナリオを考慮する必要があり、時にはそれらを丁寧に無視する必要があるかもしれません。

コンテンツビューのスクロールインジケータは、これらのコンテンツビューのサブビューがUIImageViewです。これは、任意UIImageView(例えばscrollIndicatorImageView.backgroundColor = [UIColor redColor];)を同じように使用すると、その他のサブビュー(即ちmyScrollView.subviews)のいずれかとスクロール・インジケータを変更するであろうように、あなたがアクセスUIScrollViewスクロールインジケータをできることを意味します。

#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に入金されます。

最も人気のあるソリューションは、次のコードのように見えます。

alphaプロパティのカスタムセッターを定義するUIImageViewのカテゴリを定義します。これは、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のScrollbar Imageviewを取得します。そして、NOまたは変更アルファに隠されている画像のプロパティを設定しようhere

+0

実際には、私はそれをチェックアウトしている例では、私はそれをチェックアウトしています。それはスクロールバーの色の変化に関連しています。しかし、私は常にビュー(常に可視)に表示する必要があります – Honey

+0

その視点を得る。あなたはスクロールバーオブジェクトを取得するので、隠しプロパティまたはアルファ値を調整することでスクロールバーオブジェクトを操作するだけで、常に表示されるようになります。 – iPrabu

+0

私は隠されたproperty.butのために働いていないことを試みた。私はどうすればアルファ値を使用してそれをすることができますか教えてください? – Honey

3

私は私の解決策を提供したいと考えています。私はカテゴリでもっともポピュラーなバリアントが好きではありません(カテゴリー内のメソッドのオーバーライドは、同じセレクターで2つのメソッドがあるため、実行時にどのメソッドを呼び出すべきか不明確な理由があります)。 代わりにスウィズルを使用します。また、タグを使う必要もありません。

- (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 

スクロールインジケータを(垂直スクロールインジケータ新しいクラスを追加します(私の場合self.categoriesTableView)ビューをスクロールしているあなたのビューコントローラ、このメソッドを追加します。 )は常に画面に表示されます。

+0

これはiOS 10を使用して動作します。水平スクロールバーを設定したい場合:UIViewAutoresizing.flexibleTopMargin(Swift 3.0)またはUIViewAutoresizingFlexibleTopMargin(Obj-C) –

+1

iOS 11でうまくいった。をインクルードする必要がある。 – Smartcat

関連する問題