iphone objective-c uiscrollview scrollbar

iphone - UIScrollView: muestra la barra de desplazamiento



objective-c scrollbar (9)

Posiblemente uno simple!

¿Alguien sabe cómo mostrar constantemente la barra de desplazamiento de UIScrollView?

Se muestra cuando el usuario se desplaza, por lo que pueden ver en qué posición de la vista de desplazamiento se encuentran.

PERO me gustaría que se muestre constantemente porque no es inmediatamente obvio para el usuario que está disponible el desplazamiento

Cualquier consejo sería muy apreciado.


Este trabajó para mí:

#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

Obtuve este fragmento de aquí: http://www.developers-life.com/scrollview-with-scrolls-indicators-which-are-shown-all-the-time.html


Hasta donde yo sé, esto no es posible. La única llamada API que controla la visualización del indicador de desplazamiento es showsVerticalScrollIndicator y eso solo puede desactivar la visualización del indicador por completo.

Puede flashScrollIndicators cuando aparece la vista para que el usuario sepa en qué parte de la vista de desplazamiento se encuentran.


No, no puedes hacer que se muestren siempre, pero puedes hacer que parpadeen temporalmente.

[myScrollView flashScrollIndicators];

Son indicadores de desplazamiento, no barras de desplazamiento. No puedes usarlos para desplazarte.


Para las vistas web, donde la primera subvista es una vista de desplazamiento, en el último SDK, si una página HTML es más larga que el marco, no se muestra la barra de desplazamiento, y si el contenido html coincide con el marco o si tiene un espacio en blanco en la parte inferior del marco, "parece" que no se necesita desplazamiento y nada debajo de la línea. En este caso, creo que definitivamente deberías mostrar las barras de desplazamiento en el delegado

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

método para alertar al usuario de que hay más cosas ''fuera de la caja''.

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

Con HTML, el contenido horizontal se envuelve automáticamente, así que verifique la altura del cursor web.

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

El flash es muy corto y ocurre mientras se cargan las vistas, que se puede pasar por alto. Para solucionarlo, también puede sacudir o saltar, desplazarse o escalar el contenido un poco a través de UIView commitAnimations genéricas.


Quiero ofrecer mi solución. No me gusta la variante más popular con la categoría (los métodos de anulación en la categoría pueden ser la razón de alguna indeterminación a qué método se debe llamar en tiempo de ejecución, ya que hay dos métodos con el mismo selector). Yo uso swizzling en su lugar. Y tampoco necesito usar etiquetas.

Agregue este método a su controlador de vista, donde tiene vista de desplazamiento ( self.categoriesTableView es una vista de tabla donde quiero mostrar barras de desplazamiento)

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

Agregar nueva clase

@interface AlwaysOpaqueImageView : UIImageView @end @implementation AlwaysOpaqueImageView - (void)setAlpha:(CGFloat)alpha { [super setAlpha:1.0]; } @end

El indicador de desplazamiento (indicador de desplazamiento vertical en primer lugar for ciclo y horizontal en el segundo for ciclo) estará siempre en la pantalla. Si solo necesita un indicador, solo deje esto for código del ciclo y elimine otro.


ScrollBar que funciona igual que el iOS integrado, pero puedes jugar con el color y el ancho.

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


iOS no ofrece la API. Pero si realmente quiere esto, puede agregar su indicador personalizado para desplazarse por la vista y diseñarlo usted mismo, tal como lo hace la demostración:

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

El enlace es https://github.com/flexih/MazeScrollView


mi solución para mostrar los indicadores de desplazamiento todo el tiempo

#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

ACTUALIZACIÓN : esta solución causa algunos problemas en 64 bits. Para más detalles mira here


Swift 3

Puede acceder a la barra de desplazamiento usando scrollView.subviews y modificar el alfa como se muestra aquí. Esto funciona para mi.

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