2009-12-16 5 views
6

¿Cuál es el mejor enfoque para implementar pestañas que parecen aplicaciones web en el iPhone, como la captura de pantalla siguiente (observe las pestañas "Checkin-Info-Friends")? Estos no son parte de la biblioteca estándar de UIKit, pero parece ser muy común últimamente.Pestañas parecidas a la Web para el iPhone

Pasé un tiempo considerable desarrollando aplicaciones para el iPhone, pero no desarrollé controles como ese. ¿Cuál sería el mejor enfoque aquí:

  • crear una nueva UIView para cada contenido de pestañas, y agregar las tres subvistas a la vista principal de inmediato?
  • crear nuevas UIViews solo cuando el usuario hace clic en cada una de las pestañas?
  • Pon todo el contenido en UIScrollView, y simplemente cambia la página a medida que el usuario hace clic en cada pestaña.

¿Tal vez hay controles de código abierto para esto por ahí? No pude encontrar nada.

alt text http://www.foursquaregame.com/foursquare-game-images/foursquare-game-mobile-app.jpg

Respuesta

3

Mi aproximación a un problema similar era hacer todos los puntos de vista de la ficha 4 (en mi caso), sino que responden a didReceiveMemoryWarning por la liberación de todos, pero la vista de la ficha actual. (Entonces, por supuesto, debe asegurarse de crear la nueva vista, si no existe, cuando el usuario elija una nueva pestaña.)

Pensé que era un buen compromiso, una reacción rápida al usuario al principio (y en mi caso la huella de memoria es la más baja en este momento en mi aplicación), y luego una respuesta a poca memoria para evitar disparos.

+0

¿Así que tendría un tabviewcontroller, pero 4 vistas, cada una incluyendo el "think coffee" y las pestañas (de la imagen de arriba)? –

+0

En su caso, tendría 1 controlador de tabview, una vista de base con el "café de pensar" y luego 3 vistas de pestaña más pequeñas para la parte inferior de la pantalla, una para cada pestaña. (Ahorro de memoria si las vistas de pestañas no son de pantalla completa.) –

+0

(Aunque esta decisión fue simple, porque cada una de las pestañas solo tiene algunos botones, por lo que es fácil usar el mismo controlador de vista para todas las vistas de pestañas; la lógica es simplemente métodos simples de acción de botones.) –

1

Creo que es mejor tener tres referencias de UIView * a las subvistas en la vista principal o en el controlador de vista, todas inicialmente nulas, luego tener una subrutina para ocultar las otras dos si son visibles y construir y mostrar o solo muestra la nueva vista. Asumiendo requisitos de memoria no extraordinarios.

Creo que con un área de pantalla tan pequeña las preocupaciones de carga/descarga en el nivel de subvista no son una preocupación, pero si las vistas principales deben cargarse/descargarse, las subvistas deberían irse (estar ocultas y descargadas), y al volver a cargar, loadView debería llamar a la rutina descrita en el último párrafo al inicio.

Si de hecho hay una gran cantidad de memoria o uso de recursos por cualquiera de las tres subvistas, entonces mi consejo se invierte y cada una de las subvistas y/o objetos de memoria detrás de ellos no solo debe ocultarse sino descargado siempre que sea posible. Creo que con su uso de Google maps allí, una necesidad de descargar cuando esté oculto podría aplicarse a eso.

¿Es este el buen punto para hacer? ¿Hay algún detalle extra que me falta?

1

Puede hacer que cada pestaña sea un controlador de vista real con plumilla y todo. El único inconveniente es que debe reenviar las llamadas de controlador de vista estándar que desea recibir (ver Reaparece, etc.) pero hace que la codificación sea mucho más limpia ya que codifica como lo haría para cualquier otra vista (aunque para un espacio más pequeño).

Llama a la propiedad "ver" de cada controlador para salir de la vista, que agrega como una subvista de una vista de contenedor que tiene debajo de las pestañas.

1

Si las tres son vistas de tabla, puede salirse con la suya usando un solo UITableViewController que cambia los contenidos según la pestaña seleccionada. De lo contrario, hago un segundo comentario de KHG sobre el uso de controladores de vista real para hacer una copia de seguridad de cada una de las subvistas.

Para las pestañas consideran la subclase UISegmentedControl.

+0

Gracias por la respuesta, Frank. No todas las vistas son tablas, debería haber mencionado eso. Gran idea en UISegmentedControl. –

+0

Hola, Frank, no pude encontrar la manera de subclasificar UISegmentedControl y reemplazar el método de dibujo, para generar mis propias imágenes ... ¿Tendría alguna idea de qué método debo anular? –

+1

No tengo mucha (bueno, ninguna) experiencia subclasificando elementos de UI. Puede anular el método 'drawRect', usar' [super widthForSegmentAtIndex] 'para obtener los anchos y' [super selectedSegmentIndex] 'para saber cuál resaltar. También puede caminar por el árbol de la subvista y decirle a cualquier UILabels que dibujen ellos mismos. Pero no estoy seguro de lo lejos que puedes llegar antes de que estés en territorio de rechazo de API indocumentado. –

Cuestiones relacionadas