Why does UICollectionView log an error when the cells are fullscreen?

后端 未结 10 1246
悲&欢浪女
悲&欢浪女 2020-12-08 04:06

I have a UICollectionViewController using a UICollectionViewFlowLayout where my itemSize is the size of the UICollectionView

相关标签:
10条回答
  • 2020-12-08 04:38

    I had similar issue.

    After load cell which is full width and some height of screen. on some condition I changed the height of cell then I was getting the same error

    to fix this

    I used

       func updateHeightPerRatio(with image:UIImage) {
        let ratio = collectionView.bounds.width / image.size.width
        constHeightCollectionView .constant =  ceil(image.size.height * ratio)
        collectionView.reloadData()
        collectionView.performBatchUpdates({
            collectionView.layoutIfNeeded()
        }) { (completed) in
            self.collectionView.reloadData()
            self.layoutIfNeeded()
        }
    }
    

    Solution is reload data then perform batchupdate with that collection view re -calculate the frames . after that reload collectionview again it will apply calculated frames to cell

    And now there is no log for issue now.

    Hope it is helpful

    0 讨论(0)
  • 2020-12-08 04:43

    I encountered this problem when rotating the device from portrait to landscape, back to portrait. You want to invalidate the collectionView's layout upon device rotation and before the call to super, like so:

    - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
        // Causes collection view cells to be resized upon orientation change.
        // Important that this is called *before* call to super in order to prevent error from being logged to console.
        [self.collectionView.collectionViewLayout invalidateLayout];
    
        [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    
        //...
    }
    
    0 讨论(0)
  • 2020-12-08 04:43

    I was getting the same error when I was trying to embed a UICollectionView in a UITableView. I was generating a new UICollectionView in each UITableView cell, but I did not put any constraints on the height of that UICollectionView. So, when I put a constraint on the height, that error is gone!

    0 讨论(0)
  • 2020-12-08 04:46

    This issue just occured to me on 3x screens (namely the iPhone 6 Plus.) As it turned out, the autolayout engine did not really like infinite floating point values (such as .33333333), so my solution was to floor the return height in sizeForItemAt:indexPath:.

    return CGSize(width: preferredWidth, height: floor(preferredHeight))
    
    0 讨论(0)
  • 2020-12-08 04:47

    Like Stunner, I had the same problem when rotating from landscape (picture using full width) to portrait mode. His suggestion was the only one which really helped.

    Attached the code with latest Swift for his ObjC example ... and as a bonus, my code to find the center cell of the collection view. Works quite nice ;-)

    /**
     -----------------------------------------------------------------------------------------------
    
     viewWillTransition()
    
     -----------------------------------------------------------------------------------------------
     */
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    
        // find cell in the center of the screen and store it in a global variable
        let center = self.view.convert((self.collectionView!.center), to: self.collectionView)
    
        // get the indexPath for the cell in the center of the current screen
        if let index = collectionView!.indexPathForItem(at: center) {
    
            // store it in a class property
            self.indexPathOfCenterCell = index
        }
    
        // force recalculation of margins, borders, cell sizes etc.
        self.collectionView?.collectionViewLayout.invalidateLayout()
    
        // inform UIKit about it    
        super.viewWillTransition(to: size, with: coordinator)
    }
    
    0 讨论(0)
  • 2020-12-08 04:48

    There is a property on UIViewControllerautomaticallyAdjustsScrollViewInsets–that defaults to YES. This means that when a UIViewController has a UIScrollView in its view hierarchy–which is true of a UICollectionViewController–the contentInset property of that scroll view is adjusted automatically to account for screen areas consumed by the status bar, navigation bar, and toolbar or tab bar.

    The documentation for that property states:

    automaticallyAdjustsScrollViewInsets

    Specifies whether or not the view controller should automatically adjust its scroll view insets.

    @property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets

    Discussion

    Default value is YES, which allows the view controller to adjust its scroll view insets in response to the screen areas consumed by the status bar, navigation bar, and toolbar or tab bar. Set to NO if you want to manage scroll view inset adjustments yourself, such as when there is more than one scroll view in the view hierarchy.

    The solution is to set automaticallyAdjustsScrollViewInsets to NO somewhere in your UICollectionViewController subclass, such as in viewDidLoad:

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
    

    I have put an example project on GitHub that illustrates this problem and solution. There are two branches: with_error and fixed_error. Here is a diff of the change on GitHub.

    0 讨论(0)
提交回复
热议问题