ios - how - swift 4 uicollectionview example
UICollectionView for Springboard como carpetas (2)
Estoy tratando de lograr el siguiente efecto:
Un UICollectionView
muestra una grilla de celdas para un tipo de objeto principal, por ejemplo, un álbum de fotos. Cuando toco uno de estos elementos, me gustaría desplazar ese elemento a la parte superior de la pantalla y abrir una carpeta similar a Springboard. Dentro de ese área de carpetas, se debe mostrar otra colección, que consta de los elementos de detalle, es decir, las fotos individuales de ese álbum. Al tocar en la vista "principal" restante se cierra la carpeta nuevamente. Vea este esquema:
Lo que he hecho hasta ahora es una vista de colección regular para los álbumes. Cuando selecciono uno, se desplaza al elemento seleccionado hacia la parte superior y luego usa JWFolders
para abrir una carpeta vacía en ese lugar. Una vez que se muestra eso, disparo el UINavigationController
circundante para empujar mi controlador de segunda vista con los elementos de detalle. Esa se muestra para que parezca al usuario como si fuera la misma vista.
Hay varios problemas con este enfoque, y me gustaría saber cómo hacerlo mejor:
JWFolders toma una captura de pantalla y anima dos mitades arriba / abajo para lograr el efecto de apertura. Esto está bien, pero bastante lento en un iPad3, porque mueve una gran cantidad de píxeles y la GPU del iPad3 no está a la altura de la tarea.
La segunda vista debe tener un píxel perfecto para coincidir con la primera. Es probable que se rompa accidentalmente.
Estoy limitado en cuanto a qué animaciones son posibles para la transición del controlador de vista. El
UINavigationController
predeterminado deUINavigationController
desde la derecha no es adecuado. Anulo eso para hacer una disolución cruzada, pero aún está lejos de ser ideal.
Me gustaría obtener consejos sobre cómo abordar este problema de una manera sostenible que no requiera mucha piratería creativa en contra de lo que los frameworks están diseñados para hacer. Me podría estar perdiendo algo obvio aquí, por lo que se agradecen los ejemplos de consejos generales.
Actualizar:
Cambié el enfoque un poco. Ahora uso un controlador de vista de contenedor que tiene dos controles de vista de colección integrados. Uno para el "Álbum" y otro para la parte "Fotos" en la parte inferior. Usando un UIImageView
en el medio entre los dos puedo hacer que el triángulo apunta hacia arriba. Esto también es bueno desde el punto de vista del mantenimiento, ya que facilita el mantenimiento ya que las dos colecciones se manejan por separado.
La aplicación utiliza Diseño automático, por lo que puedo cambiar la cantidad de espacio que ocupa cada una de las dos vistas integradas modificando las restricciones. Esto es mucho más rápido que el enfoque basado en la captura de pantalla con JWFolders y funciona muy bien en un iPad3 también.
Esto casi me lleva a donde quiero estar. Lo único que queda es conseguir la animación de apertura correcta. Me gustaría desplazar al mismo tiempo la colección de Álbumes, para que el elemento tocado vaya a la parte superior y ampliar la colección de fotos con el triángulo que apunta a la celda del Álbum.
¿Puedo de alguna manera "conectar" la vista inferior a esa celda a través de restricciones de diseño, de modo que scrollToItemAtIndexPath:atScrollPosition:animated:
call arrastra la vista inferior abierta?
Para evitarlo, perdería la biblioteca y causaría que iOS moviera esos elementos de pantalla sin capturas de pantalla u otros trucos. En el grifo, haz que el ícono girado mantenga su apariencia normal mientras atenúas todos los demás. Encuentre el contenido de la vista de colección desde la parte superior hasta el final de la línea donde se encuentra el icono tocado. Cree dos nuevas vistas de colección, una que contenga la mitad superior, incluido el icono tocado y una que contenga el resto, a continuación. Anima esas vistas para hacer espacio para la vista de carpeta.
La vista de carpeta es otro UICollectionView que aparece en el espacio creado. En la vista principal, se presentan una o tres vistas dependiendo de si el cajón está abierto o cerrado. Probablemente consideraría crear un controlador de vista con una vista de colección y usar la contención del controlador de vista para administrar las tres vistas. Usted tiene control total sobre cómo se presentan esas vistas, por lo que puede animar las vistas superior e inferior hacia arriba y hacia abajo simultáneamente para revelar la vista de carpeta en su lugar, como lo hace Springboard.
Cuando todo esté funcionando, podría generalizar y comenzar a hacer cosas como decidir hacer que el ícono punteado sea parte de la colección inferior con la carpeta que aparece arriba si el ícono estaba bajo en la pantalla.
(Dudo responder a esto debido a la gran cantidad de votos a favor pero ninguna respuesta, por lo que puede haberme perdido algo, pero así es como comenzaría a tratar de lograr el efecto Springboard).
Para resolver este problema de una manera relativamente fácil, podría tratar de hacer que la carpeta sea una subclase simple UICollectionView y luego insertar esa celda cuando se toca la celda de los álbumes. En la fuente de datos de vistas de colección, debe devolver un tamaño diferente, etc. para la celda de la carpeta. En la carpeta, debe crear la vista de colección de carpetas, evite que la celda de la carpeta sea la fuente de datos de la colección de carpetas de la celda.