Как я могу предотвратить прокрутку анимации строк вниз по моему TableHeaderView?
У меня есть UISearchBar в заголовке моей таблицы. Всякий раз, когда происходит анимация, например, при удалении или вставке строк, представление заголовка прокручивается вниз. Есть ли способ сообщить табличному представлению, что оно не должно (автоматически) прокручивать представление заголовка вниз? (Только пользователь должен иметь возможность сдвинуть его вниз.)
1 ответ
После обширного поиска в Google & StackOverFlow я нашел правильную подсказку: UIScrollView
, Фактическое решение, которое я искал и, наконец, реализовал, можно найти в другом вопросе: Изменить поведение прокрутки по умолчанию для заголовка раздела UITableView
Я немного настроил решение, чтобы иметь следующие свойства:
- анимации строк могут прокручиваться вниз по табличному представлению, если только не будет отображено представление заголовка
- щелчок сверху ("scroll to top") должен прокрутить табличное представление к вершине, исключая представление заголовка
- если заголовок частично виден, он должен скользить вниз, так что он полностью виден
Код для этого решения:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat searchBarHeight = self.searchBar.frame.size.height;
if (scrollView.contentOffset.y >= searchBarHeight) {
scrollView.contentInset = UIEdgeInsetsMake(-searchBarHeight, 0, 0, 0);
} else {
scrollView.contentInset = UIEdgeInsetsZero;
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (scrollView.contentOffset.y < self.searchBar.frame.size.height && scrollView.contentOffset.y > 0) {
[scrollView setContentOffset:CGPointZero animated:YES];
}
}
Этот код реализован внутри UITableViewController
который выступает в качестве делегата для UITableView
, UITableView
с другой стороны наследует от UIScrollView
, что делает эти методы доступными и выполняет всю магию.
Несколько предложений, чтобы объяснить contentOffset
а также contentInset
Это заняло у меня некоторое время, чтобы понять их значение.
- Смещение является
CGPoint
, который просто сообщает, как далеко видимый контент, то есть разделы и ячейки табличного представления, прокручивается вниз от верхнего левого угла. Представление заголовка и представление нижнего колонтитула включены, поэтому смещение (0, 0) говорит о том, что представление таблицы прокручивается до самого верха. Смещение (0, 100) означает, что представление таблицы прокручивается вниз на 100px (значение x точки обычно не используется). - Вставка является очень интересным свойством, она определяет границы
UIScrollView
как квадрупель(top, left, bottom, right)
, Поэтому табличное представление отскочит, если вы пересекаете эти границы. Значением по умолчанию является (0, 0, 0, 0), что означает, что табличное представление отскочит, если вы прокрутите выше / ниже его первой / последней ячейки. Поэтому значение (-44, 0, 0, 0) понизит границу отказов до 44px ниже начала таблицы. Поскольку мой вид заголовка имеет высоту 44px, он будет подпрыгивать каждый раз, когда вы прокручиваете вид заголовка в видимую часть экрана. Это также не позволяет анимациям строк сдвигать таблицу ниже смещения (44, 0), а команда "сдвигать вверх" будет сдвигать вид таблицы смещением (44, 0).
Надеюсь, это поможет.:)