Как установить высоту UITableViewCell в соответствии с размером содержимого UICollectionView?

У меня есть UITableView, и внутри у меня есть два UICollectionViews.

Мое требование состоит в том, что я должен сначала прокручивать UICollectionView по горизонтали. И я должен прокручивать UITableView по вертикали, потому что я не хочу прокручивать второй UICollectionView.

На изображении вы можете видеть, что первое (Заголовок «Папка») UICollectionView Мне нужно прокручивать горизонтально, а второе (Заголовок «Продукт») UICollectionView Я не хочу прокручивать вертикально, потому что мне нужно прокручивать «Завершить» UITableView.

Оба collectionView находятся в TableViewCell, и я отключил прокрутку второго UICollectionView.

Мне нужно добавить и удалить продукт, а затем я могу установить высоту ячейки TableViewSecond, на которую должен поступать контент.

введите здесь описание изображения

введите здесь описание изображения

Вот мой код:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if (0 == indexPath.section) {
        var addFolderCell = tableView.dequeueReusableCell(withIdentifier: "AddFolderCell") as? AddFolderCell

        if(nil == addFolderCell) {
            let nib:Array = Bundle.main.loadNibNamed("AddFolderCell", owner: self, options: nil)!
            addFolderCell = nib[0] as? AddFolderCell
        }

        addFolderCell?.collectionView.delegate = self
        addFolderCell?.collectionView.dataSource = self

        return addFolderCell!
    } else {
        let identifier = "CreateFolderCell"
        var createFolderCell = tableView.dequeueReusableCell(withIdentifier: identifier) as? CreateFolderCell

        if(createFolderCell == nil) {
            let nib:Array = Bundle.main.loadNibNamed("CreateFolderCell", owner: self, options: nil)!
            createFolderCell = nib[0] as? CreateFolderCell
        }

        return createFolderCell!
    }
}

//Height for row.
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    //let index : NSIndexPath = NSIndexPath(row: 0, section: 1)
    if 0 == indexPath.section {
        return 135
    }
    return 300
}  

// Высота заголовка.

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
    return 20
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return sectionsArray[section] as? String
 }
}

extension GroupDataView : UICollectionViewDelegate,UICollectionViewDataSource {
  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
      return 4
  }

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "AddFolderCollectionCell", for: indexPath) as! AddFolderCollectionCell

    //cell.backgroundColor = UIColor.white
    cell.layer.borderWidth = 0.4
    cell.layer.borderColor = UIColor.lightGray.cgColor
    cell.layer.cornerRadius = 2
    //CreateCardView(viewCorner: cell.cardView) //cell.cardView
    return  cell
  }
}  

//MARK: Макет просмотра коллекции

extension GroupDataView : UICollectionViewDelegateFlowLayout {

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
     return CGSize(width: 90, height: 130)
  }
}

Что я могу сделать? Как я могу установить высоту для tableView?


person kishor0011    schedule 03.01.2017    source источник
comment
tableView.rowHeight ? Как определено в раскадровке?   -  person OhadM    schedule 03.01.2017
comment
Да, но как я могу установить вторую высоту ячейки в соответствии с размером содержимого второго collectionView. Благодарность   -  person kishor0011    schedule 03.01.2017
comment
Похоже, вы находитесь в правильном направлении, потому что переопределение методов ViewLayout должно работать. Проблема заключается в том, чтобы передать высоту ячейки представления коллекции в высоту ячейки представления таблицы?   -  person OhadM    schedule 03.01.2017
comment
Да правильно. Как я могу сделать? Спасибо   -  person kishor0011    schedule 04.01.2017
comment
UITableViewCell содержит UICollectionView, и теперь ваш вариант использования - когда вы удаляете UITableViewCell (который содержит UICollectionView), вы понятия не имеете, высота UITableViewCell, которая зависит от высоты UICollectionViewCell?   -  person OhadM    schedule 04.01.2017
comment
Ага . Но я не хочу удалять какие-либо UITableViewCell. Спасибо   -  person kishor0011    schedule 04.01.2017
comment
Итак, что вы пытаетесь сделать? Я ничего не знаю. Если вы пытаетесь удалить collectionViewCell и настроить tableViewCell, у вас есть много способов обновить tableViewCellHeight, добавив наблюдателя для отправки параметра (поскольку collectionViewLayout вызывается более одного раза) или, возможно, использовать шаблон делегата.   -  person OhadM    schedule 04.01.2017
comment
Ага . Предположим, что изначально у меня нет права collectionView Cell. После этого предположим, что я добавил ячейку collectionView и хочу увеличить высоту ячейки tableView, но как рассчитать, насколько высота должна увеличиться? Спасибо   -  person kishor0011    schedule 04.01.2017
comment
Давайте продолжим обсуждение в чате.   -  person OhadM    schedule 04.01.2017


Ответы (1)


Я думаю, вы можете сделать это, выполнив несколько шагов:

  1. Создайте подкласс вашего UITableViewCell, назовите его CollectionCell и измените его класс в интерфейсе IB на новое имя подкласса.

  2. Создайте выход из подкласса UICollectionView в подкласс CollectionCell, где находится UICollectionView. Назовем его collectionView.

  3. Добавьте ограничения со всех сторон collectionView к границам ячеек. (сверху, справа, снизу, слева).

  4. Добавьте в IB для ограничения высоты collectionView и создайте также выход на CollectionCell. Назовем его collectionViewHeight.

  5. В tableView:cellForRowAtIndexPath: добавить код:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // ...
        // normal cell declarations you wish
        // ...
    
        (cell as! CollectionCell).collectionView.reloadData()
        let height = cell.collectionView.collectionViewLayout.collectionViewContentSize.height
        (cell as! CollectionCell).collectionViewHeight.constant = height
        return cell
    }
    
    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100 // <- Your Desired Height
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
    
person Amr Hossam    schedule 10.08.2017