2009-07-25 17 views
9

¿Cuál es la forma más sencilla, rápida o de otra manera (objetivamente) de agregar un par de controles (por ejemplo, algunos UIButtons) debajo de un UIWebView?Cómo agregar controles debajo de un UIWebView

Para ser claro, me gustaría mostrar un UIWebView de desplazamiento normal, pero cuando el desplazamiento llega al final me gustaría que haya algunos UIControls después del contenido web. Prefiero no fingir con contenido HTML/CSS que se parece a un control; idealmente deberían ser controles reales que pueda conectar a mi controlador de vista como de costumbre.

No sé si es más fácil intentar hacer esto con un gran UIScrollView que contenga tanto el UIWebView como los controles (¿habrá conflictos de desplazamiento entre UIScrollView y UIWebView anidado?), O con un UITableView que contenga el vista web y controles en celdas separadas (¿el rendimiento será terrible?), o de alguna otra manera que no he pensado.

Actualización: No creo que quiera que UIWebView se desplace; Pensé que tendría que cambiar el tamaño para acomodar todo su contenido, inhabilitar por completo su comportamiento de desplazamiento y luego permitirle al usuario desplazar su vista principal (UIScrollView o UITableView) para revelar diferentes partes de UIWebView.

+0

terminé fingiendo con HTML y CSS. -webkit-appearance: pulsador hace que esto sea más agradable. El problema con el enfoque "one large UIWebView" es que las vistas tienen un tamaño máximo de 1024x1024 píxeles, por lo que no se puede cargar necesariamente una página completa en una y colocarla dentro de UIScrollView. Debería ser posible cortar una página grande en páginas más pequeñas y usar un UIWebView por separado para cada parte, pero esta parecía ser una solución peor que simplemente ceder y hacer que los botones formen parte del contenido de la página real. –

Respuesta

8

Ni las soluciones UIScrollView ni UITableView que haya propuesto funcionarán.

Si coloca UIWebView en UIScrollView, una u otra interceptarán las volutas y desplazarán su panel de contenido, pero la otra no. No estoy seguro de cuál será, creo que sería UIScrollView. En cualquier caso, no hay ninguna disposición para que UIScrollView se desplace cuando llegue al final del desplazamiento en UIWebView, o viceversa.

Si utiliza un UITableView, UIWebView se desplazará dentro de su celda, pero el UITableView no se desplazará en absoluto, o el UIWebView no se desplazará en absoluto, y el UITableView lo hará. Si usa el estilo de tabla "agrupada", es posible que pueda desplazarse por UIWebView y UITableView, pero no sería la experiencia cohesiva que está buscando.

La única técnica que se me ocurre que podría funcionar es ensuciar las partes internas de UIWebView y agregar los botones que contienen UIView y otras cosas a la entidad de desplazamiento utilizada por UIWebView. Esto está más allá de mi alcance, pero these header dumps will get you started. Tenga en cuenta que si Apple se da cuenta de lo que está haciendo, pueden rechazar su aplicación y, además, las partes internas pueden cambiar en cualquier momento, rompiendo su código. Si sigue esta ruta, intente codificarlo de tal forma que la funcionalidad faltante cause una falla elegante.

EDIT:

Con un poco de discusión y experimentación, el PO y he llegado a la conclusión de que es muy posible, y hay una manera de hacerlo que no se basa en elementos internos en absoluto. Es decir, use una vista de desplazamiento adjunta y cambie el tamaño de la vista web una vez que se haya cargado al tamaño completo de su propia vista de contenido. Este tamaño se puede encontrar usando [webView sizeThatFits: CGSizeZero].

Si quería usar soldados de UIWebView de lograr esto, tengo un ejemplo de código corto de añadir una vista a la vista el documento de la UIWebView, ya lo tengo todo planeado de todos modos :)

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // Override point for customization after app launch 
    UIView* testView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease]; 
    UIWebView* testWebView = [[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease]; 
    [testView addSubview:testWebView]; 
    [testWebView setDelegate:self]; 
    [testWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]]; 



    [window addSubview:testView]; 
    [window makeKeyAndVisible]; 
} 
- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    UIView *insert = [[[UIView alloc] initWithFrame:CGRectMake(0, [[webView _documentView] frame].size.height, 320, 40)] autorelease]; 
    [insert setBackgroundColor:[UIColor greenColor]]; 
    [[webView _documentView] addSubview:insert]; 
} 
+0

Gracias por la respuesta exhaustiva y considerada. Sin embargo, no quiero que UIWebView se desplace, imagino que el cambio de tamaño debe ser lo suficientemente grande para mostrar todo su contenido (es decir, varias pantallas altas) y simplemente desplazarse por la vista principal para revelar una parte diferente de la gran UIWebView (y eventualmente los controles debajo de él). ¿No es eso posible? –

+0

En realidad eso puede lograrse. Tendría que cargar la solicitud (con scalesPageToFit = NO), descubrir qué tan alta es la página de alguna manera, y volver a enmarcar todo para que quepa, dentro de los contenidos de su propio UIScrollView. El único problema que veo es descubrir qué tan alta es realmente la página. Eso mismo podría requerir desorden en el interior; UIWebView sabe cómo decir que es su vista de contenido, pero no estoy seguro de que haya una forma fácil de hacerlo. Estoy jugando con un código de prueba en este momento, te haré saber cómo funciona. –

+0

Brillante. Gracias de nuevo. ¿[Tamaño de webViewThatFits: CGSizeZero] no hace el truco? (http://www.iphonedevsdk.com/forum/iphone-sdk-development/1388-getting-actual-content-size-uiwebview.html) –

1

No creo que haya ninguna manera de hacer esto dentro de las limitaciones del SDK público.

+0

Oh cariño. ¿No funcionarían ni la gran UIScrollView ni la UITableView? Por qué no? –

0

Este es como lo hago

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


for(UIView *view in [webView subviews]){ 

    if([view isKindOfClass:[UIScrollView class]]){ 
     NSLog(@"Scrollview found with tag %d", [view tag]); 

     UIScrollView *scroll= (UIScrollView *)view; 
     [scroll addSubview:self.finishBtn]; 
     [finishBtn setCenter:CGPointMake(webView.center.x, scroll.contentSize.height-30)]; 
    } 


} 

}

Cuestiones relacionadas