UITableView странное поведение прокрутки с большим заголовком на панели навигации, эффект отскока вверху автоматически обрезается / рывками при прокрутке вверх - PullRequest
1 голос
/ 01 апреля 2019

У меня есть 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
    }
}

1 Ответ

0 голосов
/ 08 апреля 2019

удалось это исправить.

Оказывается, я возвращал UIView для моего viewForHeaderInSection, и я не использовал tableView.dequeueReusableHeaderFooterView. Я буквально инициирую новый xib UIView каждый раз, когда прокручиваю tableView, что заставляет его автоматически корректировать вставку содержимого, следовательно, вызывает прерывистую прокрутку.

Итак, я создал новый пользовательский xib для моего представления заголовка раздела с типом UITableViewHeaderFooterView и просто возвращаю его в viewForHeaderInSection.

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let dayHeaderView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "ItineraryDayHeaderView") as? ItineraryDayHeaderView

    // Configure View...

    return dayHeaderView
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...