Расширьте представление таблицы и увеличьте размер содержимого прокрутки на соответствующую разницу при нажатии кнопки внутри ячейки таблицы - PullRequest
0 голосов
/ 21 июня 2019

У меня есть UITableView, который был добавлен в UIScrollView как часть контроллера представления, который придерживается части макета, показанного ниже: -

Part of the mockup

Как вы можете видеть в макете, UITableView находится между меткой «Featured Bususiness» и представлением, содержащим подпредставления зеленого и розового цвета.

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

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

Проблема заключается в расширении и сжатии родительского табличного представления таким образом, чтобы были видны все ячейки в этом табличном представлении ( табличное представление не должно быть прокручиваемым и ни одна из ячеек не должна быть скрыта ) и что только прокручиваемое представление прокручиваемо.

Вот мой код для ячейки табличного представления, которая включает в себя расширение ячейки, а также изменение размеров (высоты) таблицы и размера содержимого прокруткиview: -

func toggleBusinessesTable() {
    var businessTableHeight = self.parent!.businessTable.frame.height
    if self.parent!.indexOfCellToExpand > -1 {
        self.parent!.businessTable.snp.remakeConstraints { (make) in
            make.top.equalTo(self.parent!.featuredBusinessesHeading.snp.bottom).offset(3.5)
            make.left.equalTo(self.parent!.scroll.snp.left)
            make.width.equalTo(self.parent!.view.bounds.width)
            make.height.equalTo(CGFloat(businessTableHeight) + CGFloat(self.tableHeight))
        }
        self.parent!.scroll.layoutIfNeeded()
        self.parent!.scroll.contentSize.height = self.parent!.usersCollectionView.frame.maxY + 75
    }
    else if self.parent!.indexOfCellToExpand == -1 {
        self.parent!.businessTable.snp.remakeConstraints { (make) in
            make.top.equalTo(self.parent!.featuredBusinessesHeading.snp.bottom).offset(3.5)
            make.left.equalTo(self.parent!.scroll.snp.left)
            make.width.equalTo(self.parent!.view.bounds.width)
            make.height.equalTo(CGFloat(businessTableHeight) - CGFloat(self.tableHeight))
        }
        self.parent!.scroll.layoutIfNeeded()
        self.parent!.scroll.contentSize.height = self.parent!.usersCollectionView.frame.maxY + 75
    }
}

func expandCell(_ sender: UI.Button) {
    if self.parent!.indexOfCellToExpand != self.tag {
        print("EXPANDING...")
        self.parent!.indexOfCellToExpand = self.tag
        self.parent!.businessTable.reloadRows(at: [IndexPath(row: self.tag, section: 0)], with: .fade)
        self.parent!.businessTable.scrollToRow(at: IndexPath(row: self.tag, section: 0), at: .top, animated: true)
    }
    else if self.parent!.indexOfCellToExpand == self.tag {
        print("CONTRACTING...")
        self.parent!.indexOfCellToExpand = -1
        self.parent!.businessTable.reloadRows(at: [IndexPath(row: self.tag, section: 0)], with: .fade)
        self.parent!.businessTable.scrollToRow(at: IndexPath(row: self.tag, section: 0), at: .top, animated: true)
    }
    //        self.toggleBusinessesTable()
}

parent - это контроллер представления, имеющий представление прокрутки и представление таблицы

businessTable - это UITableView - рассматриваемая таблица, а scroll это UIScrollView, который содержит табличное представление

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

de вычисляет разницу, на которую должна увеличиваться ячейка табличного представления: -

    // tableHeight is initially 0 at the beginning
    if self.business_service_charges.count <= 4 {
        for each in self.business_service_charges {
            self.tableHeight += 80 + each.sub_service_charges.count*80
        }
    } else if self.business_service_charges.count > 4 {
        for each in self.business_service_charges[0...3] {
            self.tableHeight += 80 + each.sub_service_charges.count*80
        }
    }

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

Но при выполнении self.toggleBusinessesTable() табличное представление расширяется больше, чем должно расширяться, добавляя лишний интервал между нижним представлением и табличным представлением, а при сжатии табличное представление становится меньше, скрывая другие ячейки, делая таблицуview scrollable.

Подпрограмма UITableView для размера: -

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if indexPath.row == indexOfCellToExpand {
        var tableHeight = 0
        if self.featuredBusinesses[indexPath.row].businessServiceCharges.count <= 4 {
            for each in self.featuredBusinesses[indexPath.row].businessServiceCharges {
                tableHeight += 80 + each.sub_service_charges.count*80
            }
        } else if self.featuredBusinesses[indexPath.row].businessServiceCharges.count > 4 {
            for each in self.featuredBusinesses[indexPath.row].businessServiceCharges[0...3] {
                tableHeight += 80 + each.sub_service_charges.count*80
            }
        }
        return CGFloat(250 + tableHeight)
    }
    return 250
}

indexOfCellToExpand - это переменная, которая отслеживает ячейку табличного представления, которая расширилась

КороткоЕсть ли способ развернуть и свернуть табличное представление и изменить размер содержимого представления прокрутки соответствующим образом, чтобы получить желаемый эффект в качестве макета?

Любая помощь будет принята с благодарностью.

Также я использовал snapkit для настройки макета ячейки

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Вместо расчета высоты и изменения вида прокрутки .contentSize вы можете использовать автоматическое расположение с подклассом UITableView, который определяет собственную высоту:

final class ContentSizedTableView: UITableView {

    override var contentSize:CGSize {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }

    override var intrinsicContentSize: CGSize {
        layoutIfNeeded()
        return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
    }

}

Когда вы изменяете табличное представление - либо добавляя / удаляя строки или разделы, либо изменяя высоту строк - табличное представление intrinsicContentSize будет автоматически обновляться, а его высота будет увеличиваться или уменьшаться, как многострочный UILabel.

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

0 голосов
/ 21 июня 2019

Попробуйте это

func expandCell(_ sender: UI.Button) {
    if self.parent!.indexOfCellToExpand != self.tag {
        print("EXPANDING...")
        self.parent!.indexOfCellToExpand = self.tag
        self.parent!.businessTable.reloadRows(at: [IndexPath(row: self.tag, section: 0)], with: .fade)
        self.parent!.businessTable.scrollToRow(at: IndexPath(row: self.tag, section: 0), at: .top, animated: true)
    }
    else if self.parent!.indexOfCellToExpand == self.tag {
        print("CONTRACTING...")
        self.parent!.indexOfCellToExpand = -1
        self.parent!.businessTable.reloadRows(at: [IndexPath(row: self.tag, section: 0)], with: .fade)
        self.parent!.businessTable.scrollToRow(at: IndexPath(row: self.tag, section: 0), at: .top, animated: true)
    }
    //        self.toggleBusinessesTable()
    yourTableView.reloadData()
}
...