Variable width & height of UICollectionViewCell using AutoLayout with Storyboard (without XIB)

后端 未结 3 2324
长情又很酷
长情又很酷 2021-02-19 19:05

Here is an design issue in the app that uses AutoLayout, UICollectionView and UICollectionViewCell that has automatically resizable width & height depending on AutoLayout co

相关标签:
3条回答
  • 2021-02-19 19:59

    If you are using constraints, you don't need to set a size per cell. So you should remove your delegate method func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize

    Instead you need to set a size in estimatedItemSize by setting this to a value other than CGSizeZero you are telling the layout that you don't know the exact size yet. The layout will then ask each cell for it's size and it should be calculated when it's required.

    let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.estimatedItemSize = someReasonableEstimatedSize()
    
    0 讨论(0)
  • 2021-02-19 20:03

    Just like when dynamically size Table View Cell height using Auto Layout you don't need call

    func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

    in

    optional func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat

    the proper way is create a local static cell for height calculation like a class method of the custom cell

    + (CGFloat)cellHeightForContent:(id)content tableView:(UITableView *)tableView {
        static CustomCell *cell;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            cell = [tableView dequeueReusableCellWithIdentifier:[CustomCell cellIdentifier]];
        });
    
        Item *item = (Item *)content;
        configureBasicCell(cell, item);
    
        [cell setNeedsLayout];
        [cell layoutIfNeeded];
        CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
        return size.height + 1.0f; // Add 1.0f for the cell separator height
    }
    

    and I seriously doubt storyboard is some industry standard. xib is the best way to create custom cell like view including tableViewCell and CollectionViewCell

    0 讨论(0)
  • 2021-02-19 20:08

    To calculate the CollectionView cell's size dynamically, just set the flow layout property to any arbitrary value:

     let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
     flowLayout.estimatedItemSize = CGSize(width: 0, height: 0)
    
    0 讨论(0)
提交回复
热议问题