2010-08-27 13 views
7

Tengo un texto que debe mostrarse en mi aplicación. El texto contiene enlaces que deben ser interactivos. He intentado algunas soluciones para hacer enlaces tappables en UITextViews y UILabels.dimensionando dinámicamente un UIWebView basado en el tamaño de fuente de su contenido

  1. UITextView enlaces

    • UITextView proporciona detectores de datos que se recogen en las direcciones URL y los hacen hacer tapping.
    • Me resulta inutilizable porque el enlace solo se abrirá de forma externa en Safari, no hay manera de tomar el control y hacer lo que quiera con el enlace.
  2. UILabel enlaces con "etiquetas de lujo" (http://furbo.org/2008/10/07/fancy-uilabels/)

    • Casi la solución perfecta, que proporciona detección de enlaces y una forma para que el usuario pueda ver y tocar ellos en línea y me da un control completo sobre qué hacer con un enlace cuando se presiona.
    • Actualmente inutilizable porque la implementación usa UIButton s para superponer los enlaces y no se envuelven con el texto en enlaces largos.

Finalmente me decidí por usar una vista web. Paso el texto a la vista web y construyo un envoltorio HTML básico a su alrededor y todo es caprichoso. Este es el mismo enfoque que usa Twitter para iPhone (también conocido como Tweetie).

El único problema que tengo ahora es que si el texto es demasiado largo, la vista web recorta el desbordamiento y se desplaza para ver el texto recortado. En segundo lugar, si el texto es demasiado corto, hay una gran área de espacio desperdiciado debajo de la vista web.

A diferencia de Tweetie, tengo más contenido debajo de la vista web, y quiero evitar el desbordamiento de desplazamiento o el espacio desperdiciado. La vista web es una subvista de una vista de desplazamiento de todos modos, por lo que el contenido de la página completa puede crecer sin necesidad de desplazarse por las subvistas.

¿Hay alguna manera de cambiar dinámicamente la vista web para que tenga la altura correcta según su contenido?

He intentado muchas cosas hasta ahora, nada parece ser una solución sólida:

  • sizeToFit no hace nada (o, más probablemente, simplemente establece el tamaño a lo que el cuadro actual es de todos modos).
  • sizeThatFits: devuelve su tamaño actual de todos modos.
  • NSString 's sizeWithFont:constrainedToSize: no es posible porque UIWebView y UIFont tienen diferentes representaciones de qué tamaño es 18.
    • Solo para explicar este punto. En mis pruebas, encontré que una vista web con un scaleFactor de 1.0 y scalesPageToFit establecido en NO y un tamaño de fuente para todo el conjunto de páginas a 13.5pt (en CSS) representa texto del mismo tamaño que UILabel con un UIFont de tamaño 18. Si alguien puede explicarme, estaría agradecido.
  • Además, en la webView estoy usando la propiedad CSS word-wrap: break-word; para evitar que la vista web se desplace horizontalmente con palabras largas o URL. Debido a esto, el comportamiento de ajuste entre webView y UILineBreakModeWordWrap difiere por completo. Incluso el uso de UILineBreakModeCharacterWrap no produce los mismos resultados.

O no hay forma de hacerlo, o estoy siendo tonto y me falta algo simple. Si alguien pudiera darnos una idea, estaría muy agradecido. Gracias.

Respuesta

1

he encontrado una solución a mi problema en http://www.iphonedevsdk.com/forum/iphone-sdk-development/1388-getting-actual-content-size-uiwebview.html

No estoy convencido de que es la mejor solución, pero que está funcionando. Si alguien tiene mejores ideas, me complacerá escucharlas.

Terminé ejecutando ese javascript en mi webView en webViewDidFinishLoad:. Tengo un solo elemento div envolver el contenido de mi llamada cuerpo, por lo que mi código es el siguiente:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    NSString *string = [_webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"body\").offsetHeight;"]; 
    CGFloat height = [string floatValue] + 8; 
    CGRect frame = [_webView frame]; 
    frame.size.height = height; 
    [_webView setFrame:frame]; 

    if ([[self delegate] respondsToSelector:@selector(webViewController:webViewDidResize:)]) 
    { 
     [[self delegate] webViewController:self webViewDidResize:frame.size]; 
    } 
} 

que tenía que rellenar la altura ligeramente a medida que el valor original no tuvo en cuenta los tamaños de los márgenes, etc.

Después de obtener la altura, le devuelvo el mensaje a mi delegado de que la vista web sí cambió de tamaño para que se pueda hacer el diseño.

3

En realidad, puedes usar -sizeThatFits: con un pequeño truco. Ver my response a una pregunta similar.

+0

Se ve bien, lo intentaré la próxima vez que necesite hacer esto. – Jasarien

Cuestiones relacionadas