У меня есть UITableView
с несколькими разделами с заголовком, складной / расширяемый. А также tableHeaderView с пользовательскими UIView
.
Использование пользовательского заголовка раздела UIView
, а также пользовательского UITableViewCell
.
Когда все разделы и строки полностью раскрыты, возникает странное поведение прокрутки, когда я прокручиваю вверх (прокручиваю вниз), когда достигаю самого верха, заголовок большой панели навигации должен следовать за моим жестом прокрутки вниз и оживить его вниз (эффект отказов). Однако в этом случае эффект отскока не возникает, в тот момент, когда я прокручиваю вверх и пытаюсь прокрутить больше для эффекта отскока, прокрутка автоматически отключается, и панель навигации автоматически становится небольшим заголовком.
Удивительно, но когда я свернул все строки первого раздела, поведение прокрутки возвращается к нормальному состоянию.
Вот gif, чтобы показать мою запись экрана.
https://i.imgur.com/WwXmpmZ.gifv
Я установил следующее для UITableView
:
self.tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 15, right: 0)
self.tableView.estimatedRowHeight = 0
self.tableView.estimatedSectionHeaderHeight = 0
self.tableView.estimatedSectionFooterHeight = 0
Я также пробовал:
self.tableView.contentInsetAdjustmentBehavior = .never
Это действительно решило странное поведение прокрутки, однако оно заставляет мои заголовки разделов и строки перекрываться с моим tableHeaderView.
То, как я справляюсь с развалом / расширением. Если свойство объекта isCollapsed
имеет значение true, я просто возвращаю 0 строку для этого раздела:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == self.scheduleCount {
//Last section
return self.dataSource.count
}
guard let schedule = self.itineraryDataSource?.schedule[section] else { return 0 }
if schedule.isCollapsed {
return 0
} else {
return schedule.items.count
}
}
Это все делегаты высоты, последний раздел имеет различную UITableViewCell
, следовательно, разную высоту.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == self.scheduleCount {
//Last section
return 40
}
return 64
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == self.scheduleCount {
//Last section
return 112
} else {
return 76
}
}