Swift: Cómo actualizar el layout UICollectionView

Utilicé UICollectionView (flowlayout) para crear un layout 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.

introduzca la descripción de la imagen aquí

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

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

pero no puedo encontrar una manera de actualizar el layout de 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 }} 

Agregue esta function:

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() myCollection.reloadData() } 

Cuando cambie la orientación, se llamará a esta function.

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

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

puede actualizar su UICollectionView Layout utilizando

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