iOS UICollectionView prototype cell size property ignored

后端 未结 9 1938
花落未央
花落未央 2021-01-30 19:51

I\'m using a UICollectionView with two prototype cells. The prototype cells have different widths and contain different controls (image view and web view). I\'m definitely ret

相关标签:
9条回答
  • 2021-01-30 20:13

    The size of the cell in the storyboard editor is just to help you design the cell. Since each prototype cell can be a different size, UICollectionView doesn't know which cell's size to pick for all the cells. That's why you set the actual size you want to use for your cells separately. You can do it in the designer by selecting the collection view and setting its Cell Size Width and Height in the Size inspector, under the "Collection View Size" heading.

    Or, you can override the following method and return a CGSize object that specifies the size you want to use for each cell. Using this method, you can actually have each cell be a different size:

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    

    Example:

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
        return CGSizeMake(100, 100);
    }
    

    Your view controller needs to be a delegate of UICollectionViewDelegateFlowLayout in order for this method to be called. So don't forget to add that delegate declaration to your view controller's .h file, such as:

    @interface MyViewController () <UICollectionViewDelegateFlowLayout>
    

    Swift

    extension MyViewController : UICollectionViewDelegateFlowLayout {
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            return CGSize(width: 100, height: 100)
        }
    }
    
    0 讨论(0)
  • 2021-01-30 20:16

    If all the cells are the same size and you can set the itemSize on the UICollectionViewFlowLayout

    Example:

    ((UICollectionViewFlowLayout *) self.collectionViewLayout).itemSize = CGSizeMake(100, 100);
    
    0 讨论(0)
  • 2021-01-30 20:17

    Use its Default Delegate . . .

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        CGSize mElementSize;
        mElementSize = CGSizeMake(SCREEN_WIDTH , SCREEN_HEIGHT *0.60);
        return mElementSize;
    }   
    
    0 讨论(0)
  • 2021-01-30 20:20

    Try to use UICollectionViewDelegateFlowLayout method. In Xcode 11 or later, you need to set Estimate Size to none from Storyboard.

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: 
    UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
          let padding: CGFloat =  170
          let collectionViewSize = advertCollectionView.frame.size.width - padding
          return CGSize(width: collectionViewSize/2, height: collectionViewSize/2)
    }
    
    0 讨论(0)
  • 2021-01-30 20:23

    Swift, working for latest iOS.

    (collectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize = cellSize
    

    I don't have enough points to reply to Sam, but the key is that it's not UICollectionViewLayout but UICollectionViewFlowLayout.

    0 讨论(0)
  • 2021-01-30 20:28

    You can set size of UICollectionViewCell in UICollectionView properties.

    In Storyboard, Select Collection View at the Document Outline, then edit your Cell Size in Size Inspector.

    And you should change Cell's size type to Default, if it is Custom.

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