inside doesn ios iphone uiscrollview

ios - doesn - uiscrollview swift programmatically



UIScrollView image/photo viewer con paginación habilitada y zoom (8)

ACTUALIZAR

Eliminé mi respuesta anterior debido a las noticias a continuación ...

Grandes noticias para aquellos que no han escuchado. Apple ha lanzado los videos de la sesión de la WWDC 2010 a todos los miembros del programa para desarrolladores de iphone. ¡Uno de los temas discutidos es cómo crearon la aplicación de fotos! Construyen una aplicación muy similar paso a paso y han hecho todo el código disponible de forma gratuita.

No usa una API privada tampoco. Aquí hay un enlace a la descarga del código de muestra. Probablemente necesites iniciar sesión para obtener acceso.

Mira esto

Y, aquí hay un enlace a la página de iTunes WWDC:

Mira esto

Bien, creo que es hora de hacer un lugar oficial en Internet para este problema: cómo hacer un visor de fotos UIScrollView con paginación y zoom. Bienvenido a mis compañeros UIScrollView hackers.

Tengo un UIScrollView con paginación habilitada, y estoy mostrando UIImageViews como la aplicación de fotos incorporada. (¿Le suena familiar?)

Encontré el siguiente proyecto en github:

http://wiki.github.com/andreyvit/ScrollingMadness

Que muestra cómo implementar el zoom en una vista de desplazamiento mientras la búsqueda está habilitada. Si alguien más lo prueba, en realidad tuve que eliminar la subclase UIScrollView y usar la clase nativa, de lo contrario, no funciona. Creo que es debido a los cambios en el SDK 3.0 relacionados con cómo la vista de desplazamiento intercepta los eventos táctiles.

Así que la idea es eliminar todas las otras vistas cuando comiences a hacer zoom, y mover la vista actual a (0, 0) en la vista de scrollview , actualizar el contentsize etc. Luego, cuando vuelves a acercar a 1.0f, agrega las otras vistas y pone las cosas nuevamente en orden.

De todos modos, ese proyecto funciona perfectamente en el simulador, pero en el dispositivo hay un movimiento desagradable de la vista que está cambiando de tamaño, que parece que está causado por el hecho de que estamos cambiando el contentsize / offset etc. para que la vista cambie de tamaño. Tienes que hacer esta vista moviéndote; de ​​lo contrario, puedes desplazarte hacia la izquierda a través del espacio en blanco que dejan las otras vistas.

Encontré una nota interesante en los "Problemas conocidos" de las notas de la versión 3.0 del SDK :

UIScrollView: después de hacer zoom, se ignora el recuadro de contenido y el contenido se deja en la posición incorrecta.

Esto suena como lo que está sucediendo aquí. Después de acercar, la vista cambiará fuera de pantalla porque ha cambiado el desplazamiento, etc.

He pasado horas en esto y estoy disminuyendo la triste realidad de que esto no va a funcionar.

El visor de fotos de Three20 está fuera de la cuestión: es demasiado pesado y hay demasiada IU innecesaria y otros comportamientos.

La aplicación integrada Photo Photo parece hacer algo de magia. Si amplía una imagen y se desplaza a los bordes lejanos, la foto actual se mueve independientemente de la foto que se encuentra junto a ella, que no es lo que obtiene al probar esto con un UIScrollView estándar.

He visto discusiones sobre anidar los UIScrollView , pero realmente no quiero ir allí.

¿Alguien ha logrado esto con el UIScrollView estándar (y funciona en el SDK 2.2 y 3.0)? No me gusta rodar mi propio zoom + bounce + pan + paging code.


Jugué un poco con la aplicación de fotos nativa, y creo que puedo decir con confianza que están usando un solo UIScrollView. El sorteo es este: acerque una imagen y tire hacia la izquierda o hacia la derecha. Verá la foto siguiente o anterior. Si tira lo suficientemente fuerte, incluso se desplazará a la siguiente fotografía con el zoom 1.0f. Voltee hacia atrás y la foto previamente ampliada volverá también al zoom 1.0f.

Obviamente no escribí Photos.app, pero adivinaré cómo lo hicieron:

  • Un solo UIScrollView y un solo UIScrollViewDelegate
  • Completa UIScrollView con UIImageView children
  • Escuche para scrollViewDidScroll:
  • Haga algunos cálculos y descubra en qué página se encuentra actualmente
  • Escuche por viewForZoomingInScrollView:
  • Devuelve una vista diferente según el índice de la página
  • Escuche para ver scrollViewDidEndZooming:withView:atScale: y, opcionalmente, haga un anti-aliasing, etc. basado en el contenido

Si decides probarlo, cuéntame cómo te funciona. Me encantaría saber cómo finalmente terminas haciendo que esto funcione. Mejor aún, publícalo en github.


Jugué un poco con la aplicación de fotos nativa, y creo que puedo decir con confianza que están usando un solo UIScrollView. El sorteo es este: acerque una imagen y tire hacia la izquierda o hacia la derecha. Verá la foto siguiente o anterior. Si tira lo suficientemente fuerte, incluso se desplazará a la siguiente fotografía con el zoom 1.0f. Voltee hacia atrás y la foto previamente ampliada volverá también al zoom 1.0f.

Esto está mal. Estoy usando scrollviews anidados y obtengo exactamente el mismo efecto. Si está utilizando algún esquema de administración de memoria (que tuve que empezar a usar ... mi número de página es bastante alto (''entre 50 en cada 2 scrollViews)), entonces puede usar un mecanismo similar a cualquier cosa que haya activado su página cargas / descargas para activar un restablecimiento de zoom para las páginas -1 y +1 de la página actual.

Sospecho que la manzana inicia esto tan pronto como la foto anterior ha desaparecido.

Lo que no entiendo es cómo lograr un desplazamiento suave entre las páginas; siempre hay un hang muy corto en el momento de la transición. No lo entiendo. Me costó bastante arreglarlo - NSInvocationOperations fue mi primera parada, luego hice una cola de vistas reutilizable para las visitas a la página (que conservan sus vistas de imagen) ... todavía este cuelgue durned.

Solo tengo un NSOperationQueue ejecutándose, y he intentado juguetear con el número máximo de operaciones simultáneas. Mi idea era que el hilo principal se estaba atascando por las Colas rivales, o tal vez incluso por una cola que intentaba hacer mucho ... aún así, qué onda.

Incluso traté de crear versiones de baja calidad de mis medios, en caso de que ese fuera el problema. Con cada imagen que pesa alrededor de 10k (estos son jpegs, fíjate) ... lo has adivinado. El truco sigue ahí.

Estoy bastante decidido a hacer lo que hice antes y usar TTPhotoViewController desde Three20. Pasé algunas horas nadando a través de ese código, y siempre es una gran educación. En este punto, sin embargo, realmente me gustaría saber de dónde viene este truco, aunque solo sea para pasar las horas sin poder dormir y preguntándome por algo menos que el cerebro esté hirviendo.


seguro sería bueno si Apple creara un visor de imágenes como la aplicación de fotos en el SDK para que lo usemos. Actualmente estoy usando Three20 y funciona muy bien. Pero hay muchas cosas extra para llevar cuando todo lo que realmente quieres es el visor de fotos.


escribo un código para eso, y puedo ser como referencia

  1. cargar vista actual scrollview y imageview .. y para la pantalla al lado de la vista actual, solo imageview

  2. eliminar toda la vista cuando la página actual se carga para ahorrar memoria, lo que es bueno para muchos proyectos fotográficos

  3. use tag para diferenciar diferentes scrollview

_xxxx xxx

el enlace de descarga haga clic aquí


Dices que has visto discusiones sobre anidar UIScrollViews pero no quieres ir allí, pero ese es el camino a seguir. Funciona fácil y bien.

Es esencialmente lo que hace Apple en su ejemplo de PhotoScroller (y la charla de WWDC de 2010 enlazada en la respuesta de Jonah). Solo en esos ejemplos, han agregado un montón de mosaico complejo y otra administración de memoria. Si no necesita el mosaico, etc., y si no desea vadear esos ejemplos y tratar de eliminar los bits relacionados, el principio subyacente de anidar UIScrollViews es bastante simple:

  • Cree un UIScrollView externo y establezca su pagingEnabled = true. Agréguelo a su vista principal y configure su ancho y alto al ancho y alto de su vista principal.

  • Cree tantas UIScrollViews internas como desee. Establezca su ancho y alto al ancho y alto de su vista principal. Agréguelos como subvistas a su UIScrollView externo, cada uno al lado del otro, de izquierda a derecha.

  • Establezca el tamaño del contenido del UIScrollView externo al total de los anchos de todos los UIScrollViews uno al lado del otro (que es igual a [ancho de su vista principal] * [número de imágenes]).

  • Agregue el UIImageViews de sus imágenes al UIScrollViews interno, un UIImageView a cada UIScrollView interno. Establezca el tamaño del contenido de cada UIScrollView en el tamaño de cada UIImageView.

  • Establezca escalas mínimas y máximas de zoom para cada UIScrollView interno y configure cada uno de los delegados internos de UIScrollView en su Controlador de Vista. En viewForZoomingInScrollView del delegado, devuelva el UIImageView apropiado para el UIScrollView que se pasa. (Para hacer esto, solo guarde cada UIImageViews en un NSArray y establezca la propiedad correspondiente de la etiqueta UIScrollView en el índice del UIImageView apropiado. Luego puede leer la etiqueta en el UIScrollView pasado a viewForZoomingInScrollView y devolver el UIImageView apropiado del NSArray) .

Eso es. Funciona igual que la aplicación de fotos.

Si tiene muchas fotos, para ahorrar memoria solo puede tener dos UIScrollViews internas y dos UIImagesViews. A continuación, se alterna dinámicamente entre ellos, moviendo su posición dentro de UIScrollView y cambiando sus imágenes a medida que el usuario desplaza el UIScrollView externo. Es un poco más complejo pero el mismo principio.



He escrito un navegador de fotos simple y fácil de usar llamado MWPhotoBrowser . Decidí crearlo ya que Three20 era demasiado pesado / hinchado ya que todo lo que necesitaba era un visor de fotos.

MWPhotoBrowser puede mostrar una o más imágenes al proporcionar objetos UIImage, o URL a archivos, imágenes web o recursos de la biblioteca. El navegador de fotos maneja la descarga y el almacenamiento en caché de fotos de la web sin problemas. Las fotos se pueden ampliar y panoramizar, y se pueden mostrar subtítulos opcionales (personalizables). El navegador también se puede usar para permitir al usuario seleccionar una o más fotos utilizando la cuadrícula o la vista de la imagen principal.