UITableView: запустить код, когда отображается tableFooterView? - PullRequest
10 голосов
/ 01 февраля 2012

Я использую UIView tableFooterView в моем UITableView, чтобы показать метку «Загрузка еще» в нижней части моей таблицы.Когда отображается UIView в tableFooterView , мне нужно начать ленивую загрузку контента.Как узнать, когда отображается tableFooterView?

Ответы [ 5 ]

12 голосов
/ 01 февраля 2012

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

Это может быть легко реализовано в tableView:cellForRowAtIndexPath:.Отслеживая, какой IndexPath является последним, и обновляя его каждый раз, когда новые строки добавляются или удаляются, вы можете просто проверить, совпадает ли IndexPath запрошенной ячейки с IndexPath последней строки, и запустить отложенную загрузкубольше данных оттуда, так же, как вы делаете это в настоящее время.

1 голос
/ 01 февраля 2012

Вы можете преобразовать кадр нижнего колонтитула в координаты окна и сравнить их. Когда нижний колонтитул скрыт, предполагается, что он имеет исходные координаты Y> 480 (для портретного режима), когда появится нижний колонтитул, тогда исходные координаты Y <480. Сравнение можно выполнить в методе didScroll. </p>

Спасибо, надеюсь, это поможет вам.

см метод convertRect: toView:

0 голосов
/ 29 марта 2018

Простой ответ:

  func tableView(_ tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) {}
0 голосов
/ 17 декабря 2012

Если ваш tableFooterView наблюдает за изменениями свойства таблицы contentOffset (и, возможно, изменениями в свойстве таблицы contentSize), вы можете точно рассчитать, когда он прокручивается в представление со следующими переменными:

  • tableView.contentOffset.y - Вертикальная величина, на которую начало представления содержимого смещается относительно начала представления прокрутки
  • tableView.contentSize.height - Высота просмотра содержимого
  • tableView.bounds.size.height - Высота границ таблицы

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

Вы можете заключить это в оператор if и использовать его для отправки уведомления. Затем вы можете выполнить дальнейшее тестирование, чтобы нижний колонтитул тоже динамически растягивался, или другие предполагаемые эффекты:

if((tableView.contentOffset.y + tableView.bounds.size.height) > tableView.contentSize.height){
    //send notification, dynamic resizing, etc...` 
}

Вот небольшой фрагмент кода в действии:

// Set up an observer for changes in the table's contentOffset or contentSize.
// This can be done during initialisation of the tableFooterView
[tableView addObserver:self 
            forKeyPath:@"contentOffset" 
               options:NSKeyValueObservingOptionNew
               context:NULL];
[tableView addObserver:self 
            forKeyPath:@"contentSize"
               options:NSKeyValueObservingOptionNew
               context:NULL];

// Further down in code, listen for the changes:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
  change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"contentOffset"] || 
        [keyPath isEqualToString:@"contentSize"]) {

        if((tableView.contentOffset.y + tableView.bounds.size.height) > tableView.contentSize.height){
            // the tableFooterView should now be in view
            [[NSNotificationCenter defaultCenter] 
                postNotificationName:@"scrollToLoadNeedsLoad"
                              object:self];
            // dynamically change the footer here (ideal for making it stretch with the table)
        }

    }
}

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

0 голосов
/ 01 февраля 2012

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

Редактировать: старый ответ был неправильным.

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