Cómo configurar la notificación si el tamaño de la vista cambia cuando se usa multitarea | Rápido

Al probar mi aplicación en un iPad utilizando multitarea y cambio el tamaño de la aplicación en la aplicación, las celdas de vista de la colección deben cambiar de tamaño o, de lo contrario, no caben en la window de visualización.

He tomado algunas medidas como

  • Detección del dispositivo para cambiar el tamaño de las celdas.
  • mida el tamaño de la vista para asegurarse de que las células se ajusten a la window
  • Agregue un observador si el usuario cambia la orientación del dispositivo.

Esto es genial, pero cuando se cambia el tamaño de la window cuando se usa multitarea, o cuando se regresa a la aplicación de pantalla completa, los tamaños de celda no cambian y se ven fuera de lugar. Esto es forzado cambiando la orientación o cambiando los controlleres de vista, de modo que viewWillLoad o viewDidLoad se ejecuta de nuevo.

Entonces, ¿cómo puedo configurar una notificación si el tamaño de view.frame cambia?

Solutions Collecting From Web of "Cómo configurar la notificación si el tamaño de la vista cambia cuando se usa multitarea | Rápido"

Creo que está complicando el problema, simplemente use lo siguiente, así que cuando el dispositivo se gira o networkingimensiona, la vista de colección también cambia de acuerdo.

 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() guard let collectionLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else { return } if UIInterfaceOrientationIsLandscape(UIApplication.shanetworkingApplication().statusBarOrientation) { //here you can do the logic for the cell size if phone is in landscape } else { //logic if not landscape } collectionLayout.invalidateLayout() } 

Creo que la function correcta para anular es viewWillTransition(to:, with:) . Se llama siempre que el tamaño del contenedor está a punto de cambiar.

 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) self.collectionView?.collectionViewLayout.invalidateLayout() } 

Probé la respuesta de RileyDev pero la aplicación ingresó en un bucle infinito.

No hay un delegado que se ejecute solo cuando cambian los límites de la window de la aplicación, por lo que he creado mi propia versión de viewWillTransition (a tamaño y a traitCollectionDidChange.

Con el código siguiente puede detectar los cambios de cambio de tamaño de los límites de window incluso si los rasgos no cambian, y cambiar el tamaño de las celdas de vista de colección, lo que invalida el layout de vista de colección.

 var previousWindowBounds: CGRect? override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() if let currentBounds = view.window?.bounds, let previousWindowBounds = previousWindowBounds, currentBounds != previousWindowBounds { collectionView?.collectionViewLayout.invalidateLayout() } previousWindowBounds = view.window?.bounds }