tutorial collection ios swift uicollectionview flowlayout

ios - tutorial - uicollectionview swift 4



Swift: cómo actualizar el diseño de UICollectionView después de la rotación del dispositivo (6)

puede actualizar su Diseño UICollectionView usando

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { if isLandscape { return CGSizeMake(yourLandscapeWidth, yourLandscapeHeight) } else { return CGSizeMake(yourNonLandscapeWidth, yourNonLandscapeHeight) } }

Usé UICollectionView (flowlayout) para crear un diseño simple. el ancho de cada celda se establece en el ancho de la pantalla usando self.view.frame.width

pero cuando giro el dispositivo, las celdas no se actualizan.

He encontrado una función, que se llama al cambio de orientación:

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { //code }

pero no puedo encontrar una manera de actualizar el diseño UICollectionView

El código principal está aquí:

class ViewController: UIViewController , UICollectionViewDelegate , UICollectionViewDataSource , UICollectionViewDelegateFlowLayout{ @IBOutlet weak var myCollection: UICollectionView! var numOfItemsInSecOne: Int! override func viewDidLoad() { super.viewDidLoad() numOfItemsInSecOne = 8 // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { //print("orientation Changed") } func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return numOfItemsInSecOne } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cellO", forIndexPath: indexPath) return cell } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{ let itemSize = CGSize(width: self.view.frame.width, height: 100) return itemSize }}


La mejor opción es llamar a invalidateLayout() lugar de reloadData() porque no forzará la recreación de las celdas, por lo que el rendimiento será un poco mejor:

override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() myCollection.collectionViewLayout.invalidateLayout() }


También puede invalidarlo de esta manera.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; [self.collectionView.collectionViewLayout invalidateLayout]; }


Agregar esta función:

override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() myCollection.collectionViewLayout.invalidateLayout() }

Cuando cambie la orientación, se invocará esta función.


para actualizar el método traitCollectionDidChange UICollectionViewLayout traitCollectionDidChange se puede usar:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) guard let previousTraitCollection = previousTraitCollections else { return } collectionView?.collectionViewLayout.invalidateLayout() }


ViewWillLayoutSubviews () no funcionó para mí. Tampoco lo hizo viewDidLayoutSubviews (). Ambos hicieron que la aplicación entrara en un bucle infinito que revisé usando un comando de impresión.

Una de las formas en que funciona es

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { // Reload here }