Swift: How to refresh UICollectionView layout after rotation of the device

后端 未结 14 862
闹比i
闹比i 2020-12-01 02:38

I used UICollectionView (flowlayout) to build a simple layout. the width for each cell is set to the width of screen using self.view.frame.width

but whe

相关标签:
14条回答
  • 2020-12-01 03:04

    My Code :

    override func viewWillLayoutSubviews() {
       super.viewWillLayoutSubviews()
       self.collectionView.collectionViewLayout.invalidateLayout()
    }
    

    Will work correctly!!!

    0 讨论(0)
  • 2020-12-01 03:08

    To update UICollectionViewLayout, traitCollectionDidChange method might be used as well:

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
    
        guard previousTraitCollection != nil else { return }
        collectionView?.collectionViewLayout.invalidateLayout()
    }
    
    0 讨论(0)
  • 2020-12-01 03:09

    The viewWillLayoutSubviews() did not work for me. Neither did viewDidLayoutSubviews(). Both made the app go into an infinite loop which I checked using a print command.

    One of the ways that do work is

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    // Reload here
    }
    
    0 讨论(0)
  • 2020-12-01 03:12

    I was also having some problem but then it got solved using :

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
            collectionViewFlowLayoutSetup(with: view.bounds.size.width)
            collectionView?.collectionViewLayout.invalidateLayout()
            collectionViewFlowLayoutSetup(with: size.width)
        }
    
        fileprivate func collectionViewFlowLayoutSetup(with Width: CGFloat){
    
            if let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout {
                flowLayout.estimatedItemSize = CGSize(width: Width, height: 300)
            }
    
        }
    
    0 讨论(0)
  • 2020-12-01 03:13

    Add this function:

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

    When you change the orientation, this function would be called.

    0 讨论(0)
  • 2020-12-01 03:13

    you can update your UICollectionView Layout by using

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        if isLandscape {
            return CGSizeMake(yourLandscapeWidth, yourLandscapeHeight)
        }
        else {
            return CGSizeMake(yourNonLandscapeWidth, yourNonLandscapeHeight)
        }
    }
    
    0 讨论(0)
提交回复
热议问题