2009-12-11 15 views
53

Möglicherweise ein einfacher!UIScrollView - zeigt die Bildlaufleiste an

Weiß jemand, wie man die Bildlaufleiste eines UIScrollView ständig anzeigen lassen kann?

Es zeigt, wenn der Benutzer blättert, damit sie sehen können, welche Position der Scroll-Ansicht in sie sind.

aber ich würde es immer wieder gerne zu zeigen, weil es nicht sofort offensichtlich für den Benutzer ist, der ist Scrollen verfügbar

Jeder Rat würde sehr geschätzt werden.

Antwort

82

Nein, Sie können sie nicht immer anzeigen lassen, aber Sie können sie vorübergehend blinken lassen.

[myScrollView flashScrollIndicators]; 

Sie sind Scroll-Indikatoren, nicht Bildlaufleisten. Sie können sie nicht zum Scrollen verwenden.

+2

Richtig, es wäre eine inkonsistente Benutzererfahrung, wenn sie die ganze Zeit da wären. Dies ist der richtige Ansatz. –

+1

Wenn Sie die Kontrolle über den Inhalt haben, können Sie den Benutzern Anhaltspunkte dafür geben, dass der Inhalt scrollbar ist, indem einige der Inhalte die Grenzen überschreiten. Wie ein Bild, das nur einen Teil zeigt, der mehr Inhalt vorschlagen würde. Dann kann der Benutzer experimentieren und wischen, um mehr zu sehen. – Sophtware

+1

Funktioniert nicht für [UIWebView.scrollView] :( – Dmitry

4

Soweit ich weiß, ist dies nicht möglich. Der einzige API-Aufruf, der die Anzeige des Scrollindikators steuert, ist showsVerticalScrollIndicator, und das kann nur die Anzeige des Indikators insgesamt deaktivieren.

Sie könnten flashScrollIndicators, wenn die Ansicht angezeigt wird, so dass der Benutzer weiß, wo in der Bildlaufansicht sie sind.

0

Bei WebViews, bei denen die erste Teilansicht ein Scrollview ist, wird im neuesten SDK, wenn eine HTML-Seite länger als der Frame ist, keine Bildlaufleiste angezeigt, und wenn der HTML-Inhalt zufällig mit dem Frame ausgerichtet ist Sie haben ein Leerzeichen am unteren Rand des Rahmens, es sieht so aus, als ob keine Schriftrolle benötigt wird und nichts unter der Linie. In diesem Fall denke ich, Sie auf jeden Fall die Bildlaufleisten in der

- (void)webViewDidFinishLoad:(UIWebView *)webView; 

Methode des Delegierten blinken sollte den Benutzer zu warnen, dass es mehr Sachen ‚außerhalb der Box‘ ist.

NSArray *subViews = [[NSArray alloc] initWithArray:[webView subviews]] ; 
UIScrollView *webScroller = (UIScrollView *)[subViews objectAtIndex:0] ;  

Bei HTML wird der horizontale Inhalt automatisch umgebrochen, überprüfen Sie daher die Höhe des Webshecrollers.

 if (webScroller.contentSize.height > webView.frame.size.height) { 
      [webScroller flashScrollIndicators]; 
     } 

Der Blitz ist so kurz, und passiert, während über Ansichten geladen werden, dass es übersehen werden kann. Zum Umgehen dass, könnten Sie auch wackeln oder hüpfen oder blättern oder den Inhalt ein wenig über die allgemeine UIView commitAnimations maßstabs

6

my solution für Show Scroll-Indikatoren die ganze Zeit

#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 

UPDATE: Diese Lösung Ursache einige Probleme auf 64-Bit. Für weitere Details schauen here

+0

Ich konnte das nicht zum Laufen bringen, und ich verstehe auch nicht wirklich, was es tun soll. Warum setzen wir Alpha auf die Schriftrolle, wenn wir es versuchen zeige scrollbars Kannst du bitte das Konzept hier ein wenig erklären? –

+2

Das ist nicht wirklich eine gute Antwort, es ist eine Kategorie, die jede 'UIImageView' 'setAlpha' Methode überschreibt.Es beruht auf den Scroll View Indikatoren mit einer bestimmten Tag-Nummer Es handelt sich um eine private Implementierungsdetail und kann sich ändern – lxt

+1

Das sieht wie die Ursache von http://stackoverflow.com/a/20944188/123269 aus - was zu einem UI-Fehler führt, wenn er im 64-Bit-Modus ausgeführt wird gegen diesen Code zu verwenden –

3

Dieses ist für mich gearbeitet:

#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 

bekam ich diesen Ausschnitt aus hier: http://www.developers-life.com/scrollview-with-scrolls-indicators-which-are-shown-all-the-time.html

+0

Bitte erklären Sie, wie man das verwendet? – Minakshi

+0

@Xyz Wenn Sie immer noch nach einer Erklärung suchen, wie zu uns e diesen Code siehe hier: [Scrollbar immer auf UIScrollView sichtbar machen?] (http://stackoverflow.com/questions/13697215/make-a-scrollbar-always-visible-in-xcode/15613852#15613852) –

+0

Vielen Dank Elliott Perry. – Minakshi

0

iOS bietet nicht die API.Aber wenn Sie wirklich wollen, können Sie Ihre individuelle Anzeige hinzufügen Ansicht scrollen und diese selbst Layout, wie die Demo tut:

 
- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    if (self.showsVerticalScrollIndicatorAlways) { 
     scroll_indicator_position(self, k_scroll_indicator_vertical); 
    } 

    if (self.showsHorizontalScrollIndicatorAlways) { 
     scroll_indicator_position(self, k_scroll_indicator_horizontal); 
    } 
} 

Der Link https://github.com/flexih/MazeScrollView

0

ScrollBar ist, die Funktionen ebenso wie die iOS gebaut in einem, aber Sie können mit der Farbe und Breite durcheinander bringen.

-(void)persistantScrollBar 
{ 
    [persistantScrollBar removeFromSuperview]; 
    [self.collectionView setNeedsLayout]; 
    [self.collectionView layoutIfNeeded]; 

    if (self.collectionView.contentSize.height > self.collectionView.frame.size.height + 10) 
    { 
     persistantScrollBar = [[UIView alloc] initWithFrame:(CGRectMake(self.view.frame.size.width - 10, self.collectionView.frame.origin.y, 5, (self.collectionView.frame.size.height /self.collectionView.contentSize.height) * self.collectionView.frame.size.height))]; 
     persistantScrollBar.backgroundColor = [UIColor colorWithRed:207/255.f green:207/255.f blue:207/255.f alpha:0.5f]; 
     persistantScrollBar.layer.cornerRadius = persistantScrollBar.frame.size.width/2; 
     persistantScrollBar.layer.zPosition = 0; 
     [self.view addSubview:persistantScrollBar]; 
    } 
} 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    CGRect rect = persistantScrollBar.frame; 
    rect.origin.y = scrollView.frame.origin.y + (scrollView.contentOffset.y *(self.collectionView.frame.size.height/self.collectionView.contentSize.height)); 
    rect.size.height = (self.collectionView.frame.size.height /self.collectionView.contentSize.height) * self.collectionView.frame.size.height; 
    if (scrollView.contentOffset.y <= 0) 
    { 
     rect.origin.y = scrollView.frame.origin.y; 
     rect.size.height = rect.size.height + (scrollView.contentOffset.y); 
    } 
    else if (scrollView.contentOffset.y + scrollView.frame.size.height >= scrollView.contentSize.height) 
    { 
     rect.size.height = rect.size.height - ((scrollView.contentOffset.y + scrollView.frame.size.height) - scrollView.contentSize.height); 
     rect.origin.y = (self.collectionView.frame.origin.y + self.collectionView.frame.size.height - 5) - rect.size.height; 
    } 

    persistantScrollBar.frame = rect; 
} 
1

Ich möchte meine Lösung anbieten. Ich mag nicht die beliebteste Variante mit Kategorie (überschreibende Methoden in der Kategorie können der Grund einiger Unbestimmtheit sein, welche Methode in Laufzeit aufgerufen werden sollte, da es zwei Methoden mit demselben Selektor gibt). Ich verwende stattdessen Swizzling. Und ich brauche auch keine Tags.

diese Methode, um Ihre View-Controller hinzufügen, in dem Sie Ansicht blättern haben (self.categoriesTableView Eigenschaft ist eine Tabellenansicht, wo ich Scrollbalken zeigen will)

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // Do swizzling to turn scroll indicator always on 
    // Search correct subview with vertical 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; 
        } 
       } 
      } 
     } 
    } 
    // Search correct subview with horizontal scroll indicator image across tableView subviews 
    for (UIView * view in self.categoriesTableView.subviews) { 
     if ([view isKindOfClass:[UIImageView class]]) { 
      if (view.alpha == 0 && view.autoresizingMask == UIViewAutoresizingFlexibleTopMargin) { 
       if (view.frame.size.height < 10 && view.frame.size.height < view.frame.size.width) { 
        if (self.categoriesTableView.frame.size.width < self.categoriesTableView.contentSize.width) { 
         // 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]; 
} 

Neue Klasse

@interface AlwaysOpaqueImageView : UIImageView 
@end 

@implementation AlwaysOpaqueImageView 

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

@end 

Die Scroll-Anzeige (vertikale Scroll-Anzeige in ersten for Zyklus und horizontal in zweiten for Zyklus) wird immer auf dem Bildschirm sein. Wenn Sie nur einen Indikator benötigen, lassen Sie nur diesen for Zyklus in Code und entfernen Sie einen anderen.

+0

Hi, welche Änderungen brauche ich für den horizontalen Indikator? – Asim

+0

@Asm, siehe meine aktualisierte Antwort –

0

Swift 3

können Sie die Scrollbar scrollView.subviews mit Zugriff auf und die Alpha ändern, wie hier gezeigt. Für mich geht das.

extension UIScrollView { 
    override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for x in self.subviews { 
      x.alpha = 1.0 
     } 
    } 
} 

extension MyScrollViewDelegate : UIScrollViewDelegate { 
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
     for x in scrollView.subviews { 
      x.alpha = 1.0 
     } 
    } 
} 
Verwandte Themen