2010-02-01 7 views
8

Parece un problema que podría tener una solución simple, pero no he encontrado nada que pueda guiarlo. Estoy usando UIWebView dentro de UIScrollView y tocando en la barra de estado (para desplazar el contenido a la parte superior) no está funcionando.UIScrollView + UIWebView = NO scrollsToTop

He hecho una aplicación de prueba simple para ver si realmente es culpa de UIWebViews. Y realmente lo es.

// scrolls to top on status bar tap 
UIScrollView *sv = [[UIScrollView alloc] init]; 
sv.frame = CGRectMake(0, 0, 320, 480); 
sv.contentSize = CGSizeMake(320, 1200); 
[self.view addSubview:sv]; 

// doesn't scroll 
UIScrollView *sv = [[UIScrollView alloc] init]; 
sv.frame = CGRectMake(0, 0, 320, 480); 
sv.contentSize = CGSizeMake(320, 1200); 

UIWebView *wv = [[UIWebView alloc] init]; 
wv.frame = CGRectMake(0, 0, 320, 100); 
[sv addSubview:wv]; 

[self.view addSubview:sv]; 

Por lo tanto, creo que tal vez hay algo que podría desactivar para hacer UIWebView no ensuciar con scrollToTop? O algún tipo de solución también sería bueno.

¿Alguna idea?

Respuesta

7

Me encontré con esta última noche hasta que finalmente encontré la respuesta enterrada en un comentario de un comentario. El idea of that original post es que cuando se agrega el UIWebView a su UIScrollingView, se utiliza la siguiente:

- (void) ensureScrollsToTop: (UIView*) ensureView { 
    ((UIScrollView *)[[webView subviews] objectAtIndex:0]).scrollsToTop = NO; 
} 

Esto parecía sospechoso para mí desde el primer sub-vista de un UIWebView afirma ser UIScroller que no es una subclase de UIScrollView. Sin embargo, desde UIScroller admite la propiedad scrollsToTop, el reparto sólo nos da una manera más allá de la advertencia del compilador:

 
Class List: 
    Class = UIScroller 
    Class = UIView 
    Class = UIResponder 
    Class = NSObject 
Supported Methods: 
    ... 
    Method _scrollToTop 
    Method setScrollsToTop: 
    Method scrollsToTop 
    ... 
Supported Properties: 
    Property scrollsToTop 

EDIT: Sólo otra nota rápida acerca de dónde esta realidad tiene que ocurrir: en la devolución de llamada webViewDidFinishLoad. Llamándola en la construcción UIWebView no es lo suficientemente bueno, porque en ese momento el UIWebView no ha creado sus vistas niño, sin embargo, que son los causantes del problema:

- (void)webViewDidFinishLoad:(UIWebView *) wv {  
    [self ensureScrollsToTop: wv]; 
} 

editar # 2:

ahora, en iOS 5, como se indica en iPhone OS: Tap status bar to scroll to top doesn't work after remove/add back, use @property scrollView de UIWebView, por lo que la implementación de ensureScrollsToTop es innecesaria para proyectos que no usan destinos de implementación inferiores a iOS 5.0.

+0

Gracias nivekastoreth, esto me estaba molestando. Solo quiero señalar que te falta un '(' en ensureScrollsToTop y quiero recordarle a alguien más que encuentra esto que configure al delegado de la vista web para que se llame a webViewDidFinishLoad. –

+0

esto funciona, pero probablemente querías decir: ((UIScrollView *) [[subvistas webView] objectAtIndex: 0]). ScrollsToTop = YES; –

+0

Mi memoria de esto es un poco confusa en este momento, pero según recuerdo, el problema es que debe establecer scrollsToTop en NO porque el problema si múltiples vistas desplazables devuelven SÍ (a medida que se encadenan hacia abajo a través de los niños), en realidad deshabilita esa funcionalidad. Está solo habilitada si una y solo una vista desplazable devuelve SÍ. – nivekastoreth

3

En iPhone OS, si hay más de un UIScrollView (o su subclase, por ejemplo UITableView, UIWebView) en el viewController actual, el sistema no sabe qué UiscrollView debe desplazarse hacia arriba.

Solución rápida: para todos los UIScrollViews que no desee admitir scrollsToTop, simplemente configure los scrollsToTop como NO, entonces todo funciona perfectamente.

self.scrollView1.scrollsToTop = NO; 
self.scrollView2.scrollsToTop = NO; 
self.scrollView1.scrollsToTop = YES; // by default scrollsToTop is set as YES, this line is not necessary 
0

webviews por defecto tendrá YES para scrollsToTop-valor. He escrito una clase simple para este problema específico. En mi aplicación, tenemos múltiples vistas de web y scrollviews. Esto hace que todo sea mucho más fácil.

https://gist.github.com/hfossli/6776203

Básicamente establece scrollsToTop a NO en todos los demás scrollViews que la que está especificando.

0

Quiero añadir mi caso, añado un UIWebView en una UIScrollView, as h4xxr said:

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

Así, consigo una forma sencilla de hacerlo funcionar en webView: simplemente establezca la propiedad scrollsToTop de scrollView · s 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