UICollectionView Layout Issue

前端 未结 15 1663
天涯浪人
天涯浪人 2020-12-24 00:17

I am using UICollectionView using the flow layout. I have made a custom UICollectionViewCell for the same. But on running the project the console k

相关标签:
15条回答
  • 2020-12-24 00:50

    None of the above fixes did it for me. I fixed it with this

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {CGFloat currentWidth = collectionView.frame.size.width;
    UIEdgeInsets sectionInset = [(UICollectionViewFlowLayout *)collectionView.collectionViewLayout sectionInset]; //here the sectionInsets are always = 0 because of a timing issue so you need to force set width of an item a few pixels less than the width of the collectionView.
    
    CGFloat width = currentWidth - 10;
    }
    
    0 讨论(0)
  • 2020-12-24 00:53

    I have same issue

    the behavior of the UICollectionViewFlowLayout is not defined because: the item height must be less than the height of the UICollectionView minus the section insets top and bottom values.

    I solved this issue by checking the values in section Insets.And for fix cell size I have used below code.

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
    CGSize result = [[UIScreen mainScreen] bounds].size;
    CGFloat scale = [UIScreen mainScreen].scale;
    result = CGSizeMake(result.width * scale, result.height * scale);
    CGFloat cellWidth =  [[UIScreen mainScreen] bounds].size.width - 20;
    CGFloat cellHeight = [[UIScreen mainScreen] bounds].size.height - 120;
    
    return CGSizeMake(cellWidth, cellHeight);
    
    
    }
    
    0 讨论(0)
  • 2020-12-24 00:56

    Had this issue myself a few times when trying to create collection views with fullscreen cells. My problem was caused by laying out for 4" screen in IB/Storyboard and specifying 320*568 for item size, but running in the simulator using 3.5" screen, which has a height of 480. The solution is to specify your item size in code with something like:

    UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout;
    layout.itemSize = self.collectionView.frame.size;
    

    This ensures that the cell size is set correctly at runtime.

    0 讨论(0)
  • 2020-12-24 00:56

    What caused this for me was that I was trying to set my cells to the size of the superview rather than the size of the UICollectionView. Simply replaced the superview frame with the UICollectionView frame.

    0 讨论(0)
  • 2020-12-24 00:57

    I know this is a very late reply, but I have also experienced this.

    Inside my view controller, let's call it MyViewController I have a UICollectionView that is using custom UICollectionViewCells. I'm implementing the method collectionView:layout:sizeForItemAtIndexPath where I am returning a item size that is dependent on the height of the UICollectionView.

    MyViewController is made in a storyboard using autolayout to control the height of the UIViewController.

    The cells look fine when in portrait mode, but did not when in landscape mode.

    I solved my issues by invalidating the UICollectionViewLayout of my UICollectionView inside the viewWillLayoutSubviews method.

    - (void)viewWillLayoutSubviews {
        [self.myCollectionView.collectionViewLayout invalidateLayout];
    }
    

    Earlier I had tried to invalidate the layout inside willAnimateRotationToInterfaceOrientation:duration, but it didn't work. The reason for this is probably that the sizes for all the views are not calculated yet, so we have to wait until autolayout has finished its magic. I refer to this SO thread.

    Update for Swift 4.0:

      override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        self.myCollectionView.collectionViewLayout.invalidateLayout()
      }
    
    0 讨论(0)
  • 2020-12-24 00:59

    If you're loading a collectionView via a container view + UICollectionViewController, you may have set a height constraint on the container view which is constraining the height of the collection view itself. In my case, I found the collectionView.contentSize was taller than the constraint I had set on my container view.

    Obviously this is a bit of an edge case but just in case you have a similar setup, I figured I'd add this comment.

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