Как дать динамическое дополнительное пространство после последней ячейки в UITableView - PullRequest
0 голосов
/ 03 мая 2018

Допустим, у меня есть UITableView с динамическим содержимым, но представьте его с одним разделом, состоящим из заголовка таблицы размером 100px и 6 строк по 44px. Имейте в виду, что потенциально может быть 1 секция с 2 строками или 4 секции с 10 строками и т. Д., Полностью динамическая.

Когда tableView отображает его содержимое, я не смогу прокрутить его вообще (только отскок), потому что весь контент в tableView виден с самого начала.

Мне нужно иметь возможность прокручивать заголовок раздела размером 100px, оставляя больше свободного места внизу. Достаточно места, чтобы заголовок находился снаружи, а первая ячейка была в самом верху.

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

В тех случаях, когда высота коллективных ячеек больше, чем у видимого экрана, тогда я бы хотел, чтобы все было нормально, без дополнительного пространства внизу.

Я попытался вручную установить tableView.contentSize после reloadTable равным max(tableView.bounds.size.height+100, tableView.contentSize), но кажется, что contentSize переопределяется независимо от того, что я делаю, поэтому я пытаюсь найти другие способы сделать это.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Это сработало отлично

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let visibleHeight = self.tableView.bounds.size.height - self.topLayoutGuide.length - self.bottomLayoutGuide.length
    var actualContentSize = visibleHeight - (self.tableView.contentSize.height - (header.bounds.size.height - header.subviewThatShouldBeVisibleIfAny.bounds.size.height))
    if #available(iOS 11.0, *){
        //Nothing
    }else{
        actualContentSize += self.bottomLayoutGuide.length
    }
    var inset = self.tableView.contentInset
    if #available(iOS 11.0, *){
        inset.bottom = max(actualContentSize, 0)
    }else{
        inset.bottom = max(actualContentSize, self.bottomLayoutGuide.length)
    }
    self.tableView.contentInset = inset
}

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

0 голосов
/ 03 мая 2018

Вы ищете это. Измените смещение содержимого в соответствии с вашими потребностями.

self.tableView.contentOffset = CGPointMake(0, 100);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...