У меня есть UITableView, который был добавлен в UIScrollView как часть контроллера представления, который придерживается части макета, показанного ниже: -
Как вы можете видеть в макете, 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
для настройки макета ячейки