2009-09-01 15 views
8

uso de este método para ocultar la barra de estado:iPhone OS: estado Toque la barra para desplazarse hasta la parte superior no funciona después de eliminar/añadir vuelta

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 

Al establecer "oculta" de nuevo a NO, el de tomas to-scroll-to-top (en UIWebView, UITableView, lo que sea) ya no funciona, y requiere un reinicio de la aplicación para recuperar la funcionalidad.

¿Esto es un error (he archivado un rdar de todos modos) o me he perdido un paso? ¿Debo quizás esperar este comportamiento ya que la barra de estado "pierde contacto" de alguna manera con la vista respectiva?

Respuesta

18

Usted podría intentar establecer la propiedad ScrollsToTop true de nuevo después de volver a mostrarlo:

[currentView setScrollsToTop:YES]; 

Si eso no funciona, estás definitivamente única que muestra un punto de vista? Si hay más de una vista de desplazamiento, se ignora un mensaje scrollViewDidScrollToTop ...

+0

Muy buena observación. Probablemente se está confundiendo con múltiples vistas. Tengo que ver si puedo encontrar una solución. – avocade

+0

El problema es que es una UIWebView que necesita recuperar el comportamiento scroll-to-top, y no es una subclase UIScrollView directa ... así que setScrollsToTop: no funciona en absoluto. Es probable que tenga un scrollView en algún lugar de su estructura UIWebViewInternal, pero que parece ser _muy_ opaco. [webView valueForKey: @ "_ scrollView"] no funcionó en absoluto para obtenerla directamente. ¿Algún otro nombre adivina? :) – avocade

+0

Puede agregar UIWebView como una subvista de UIScrollView (en mi implementación es una subvista de una UITableView). Si es la única vista dentro de UIScrollView, entonces llamar a -setScrollsToTop en UIScrollView debería hacer que funcione en UIWebView ... – h4xxr

0

Me encontré con un comportamiento similar en la aplicación en la que estoy trabajando actualmente. En este caso, si carga un video de YouTube desde UIWebView, desplácese hasta los topes superiores para trabajar durante el resto del ciclo de vida de la aplicación. Supongo que esto podría suceder después de cargar también el reproductor de películas, pero no lo he confirmado. Esa funcionalidad ha existido por mucho más tiempo y probablemente tiene menos errores.

5

Usted puede utilizar el código siguiente para tener el UIWebView ignorar scrollToTop sin el extra UIScrollView:

((UIScrollView *)[[webView valueForKey:@"_internal"] valueForKey:@"scroller"]).scrollsToTop = NO; 
+4

Como esto utiliza una llamada API privada, es probable que su aplicación sea rechazada. Es posible que pueda salirse con '((UIScrollView *) [[subvistas webView] objectAtIndex: 0]). ScrollsToTop = NO;' –

+0

Gracias Alex! Mucho más elegante y seguro. –

+0

Esto funciona para mí. Gran solución, gracias! – Jasarien

3

que tenía un problema similar después de la reproducción de un vídeo de Youtube en mi aplicación. scrollsToTop todavía se estableció en YES, pero al tocar la barra de estado no tuvo ningún efecto.

Finalmente me di cuenta de que la ventana de mi aplicación ya no era la ventana clave. Después de añadir la siguiente línea a una subclase UIWindow (que ya tenía por otras razones) todo funcionaba como debería de nuevo:

if (![self isKeyWindow]) [self makeKeyWindow]; 
5

que estaba teniendo un problema similar donde se perdió la funcionalidad de desplazamiento a la parte superior. Resulta que esto solo funcionará si solo tiene una vista activa a la vez (dentro de la misma vista de desplazamiento). En mi caso, tenía una vista de tabla y otra que se desvanecía. Agregar un removeFromSuperview al final de la animación hizo el truco.

La respuesta estaba en los comentarios UIScrollView.h archivo:

/* 
this is for the scroll to top gesture. by default, a single scroll visible scroll view with this flag set will get the call. if there is more than one visible with this 
flag set or the delegeat method returns NO, the view isn't scrolled 
*/ 
@property(nonatomic) BOOL scrollsToTop;   // default is YES. if set, special gesture will scroll to top of view after consulting delegate 
7

La revisión siguiente por Alex trabajó para mí. ¡Gracias!

((UIScrollView *)[[webView subviews] objectAtIndex:0]).scrollsToTop = NO; 

tener prisa este arreglo funcionó muy bien, sin embargo dado más tiempo que pude haber subclase del UIWebView y se accede al miembro UIScrollView protegida directamente.

La preocupación que tengo con el método de Alex es que asume que UIScrollView está en el índice cero de las subvistas (la encapsulación permite que los miembros privados cambien). Lo que sugiere otra solución aún:

for (UIView* v in [webView subviews]) 
{ 
    if ([v isKindOfClass:[UIScrollView class]]) 
    { 
     (UIScrollView *)v.scrollsToTop = NO; 
    } 
} 
10

En iOS 5.0 se puede acceder a la propiedad de la ScrollView UIWebView

webView.scrollView.scrollsToTop = YES; 
0

Quiero añadir mi caso, añadir un UIWebView en una UIScrollView, como h4xxr habían respondido en la parte superior:

Si hay más de una vista de desplazamiento de un scrollViewDidScrollToTop se ignora el mensaje

Por lo tanto, me sale una manera sencilla de hacerlo funcionar en webView: simplemente establezca la propiedad scrollsToTop de scrollView · false.

Y cuando toque la barra de estado, ¡no será interceptada por scrollView, y la webView se desplazará a la parte superior!

UIScrollView *scrollView = [[UIScrollView alloc] init]; 
    scrollView.frame = self.view.bounds; 
    scrollView.scrollsToTop = false; //igore scrollView`s scrollsToTop 
    [self.view addSubview:scrollView]; 

    UIWebView *webView = [[UIWebView alloc] init]; 
    webView.frame = scrollView.bounds; 
    [scrollView addSubview:webView]; 
Cuestiones relacionadas