UICollectionView внутри UITableViewCell , динамическая Высота UITableView

У меня есть UITableViewControllerс каждым UITableViewCellсодержимым UICollectionViewгде содержимое UICollectionViewдолжно быть полностью видно. Моя проблема заключается в том, что при возврате высоты UITableViewCellя не могу вернуть правильную высоту, потому что я не могу понять, как вычислить contentSizeа UICollectionViewдля его содержания.

3 ответа

  1. Да, вы можете это сделать.Вы должны установить оценочную высоту для tableview, а также если вы хотите динамическую высоту tableview.

        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight
    

    Вы должны убедиться, что ваши ячейки имеют точно такую же высоту, как и представление коллекции.При настройке ячеек во внешнем tableview попробуйте перезагрузить данные во внутреннем collectionview, иначе из-за многоразового использования API логики ячеек не будет различать предыдущее представление коллекции.

    Усовершенствованный:

    У меня был случай, когда я должен был хранить tableview внутри клетки.

    Внутренняя ячейка выглядит так, где хранится tableview.

       @IBOutlet weak var uploadedDocumentsTableView: UITableView! // has 0 to left right top botton margin to superview on storyboard prototype (Contenview)
       @IBOutlet weak var tableViewCellHeight: NSLayoutConstraint! //To constraint the height of the tableview inside the cell.
    
    
      //This function is called when the outer tableview delegate calls cellForRowAtIndexPath to deque a cell.
       override func setupWithCellModel(cellModel: CRCustomerAreaDetailsCellModel)   {
    
        let castedCellModel = cellModel as? CRCustomerAreaDocumentUploadCellModel
        if  let documents = castedCellModel?.docUploadItem?.documents {
            tableViewCellHeight.constant = CGFloat(documents.count * 60)
        }   
        uploadedDocumentsTableView.reloadData()
      }
    

    Обычный

    extension CRCustomerAreaDocumentUploadV2GalleryCell: UITableViewDataSource {
    
    public func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 60
    }
    
    public func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let castedCellModel = cellModel as? CRCustomerAreaDocumentUploadCellModel
        if  let documents = castedCellModel?.docUploadItem?.documents {
            return documents.count
        }
        return 0
    }
    
    public func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        ...
       //Return your cell
    }
    

    }

    Высота моего внешнего tableview вычисляется автоматическим размером, но для внутреннего tableview мне нужно указать высоту самостоятельно.

  2. Я столько раз читал об этом. Не следует помещать CollectionView в TableViewCell. Это может вызвать множество проблем (например, падение кадров). Вы пробовали использовать StackView вместо этого? Вы пробовали AsyncDiplayKit?

  3. Извините, но вы не можете использовать UITableViewAutomaticDimension для определения размера ячейки с помощью UICollectionView внутри, поскольку представление коллекции не имеет правильного внутреннего размера содержимого. Следует перегрузить метод height UITableViewDelegate:

    - (CGFloat)tableView:(UITableView *)tableView 
    heightForRowAtIndexPath:(NSIndexPath *)indexPath;
    

    И верните правильную высоту из этого метода.

    Другой метод-создание пользовательского представления, содержащего UICollectionView и управляющего содержимым представления коллекции (пример из моего кода):

    - (CGSize)intrinsicContentSize
    {
        CGSize size = CGSizeMake(UIViewNoIntrinsicMetric, self.collectionView.collectionViewLayout.collectionViewContentSize.height);
    
        return size;
    }
    
    - (void)addTags:(NSArray<BLTag*>*)tags
    {
        [_tagsList addObjectsFromArray:tags];
    
        [self _reloadData];
    }
    

    Это представление возвращает правильный внутренний размер содержимого, поэтому его можно вставить в ячейку с автоматической высотой размера.