Я знаю, что существует масса кода для прокрутки табличного представления вверх, но я хочу сделать это, когда нажата верхняя строка состояния, как в собственных приложениях Apple. Это возможно?
Прокрутите UITableView вверх, коснувшись строки состояния
Ответы (9)
Вы получаете это бесплатно, но вы должны проверить, что атрибут scrollsToTop
вашего UITableView
равен ДА.
Когда это НЕ работает, это когда у вас есть объект UIScrollView
(или класс-потомок, например UITextView), встроенный в другой класс UIScrollView
(например, UITableView
). В этом случае установите для scrollsToTop
во встроенном классе UIScrollView
значение NO. Тогда будет работать поведение касания строки состояния.
scrollsToTop
на NO
для всех работающих представлений коллекции. Кажется нелогичным, но это сработало!
- person Chris Wagner; 03.10.2013
scrollsToTop = NO
правило должно применяться ко всем представлениям в окне. Например, если у вас есть боковое меню.
- person vokilam; 31.10.2013
scrollsToTop
. Убедитесь, что только для класса прокрутки (или потомка), который вы хотите прокрутить вверх при касании строки состояния, scrollsToTop
установлено значение YES
. Для любых других представлений прокрутки, встроенных в ваше основное представление прокрутки, scrollsToTop
должно быть установлено значение NO
. Если для нескольких видов прокрутки scrollsToTop
установлено значение YES
, этот жест игнорируется.
- person Mark Granoff; 09.06.2016
Если вы пришли из Google и вам нужен полный контрольный список:
- Убедитесь, что вы установили scrollsToTop = YES (согласно предложению Марка) в вашем UITableView
- Убедитесь, что вы установили scrollsToTop = NO для всех ДРУГИХ UITableViews / UIScrollViews / UITextViews в вашем окне, чтобы они не перехватывали щелчок. Я обнаружил, что много раз распечатываю все представления в моем окне, чтобы отладить это ...
- Убедитесь, что ваше табличное представление находится в 0/0 (координаты x / y) в окне - так система знает, что она должна передать сообщение
Используя информацию, приведенную в других ответах, я добавил в свой UITableViewController следующий код, чтобы заставить его работать:
- (void)viewDidLoad { [super viewDidLoad]; for (UITextView *view in self.view.subviews) { if ([view isKindOfClass:[UITextView class]]) { view.scrollsToTop = NO; } } self.tableView.scrollsToTop = YES; }
Это просматривает все представления в иерархии UITableViewController и отключает scrollsToTop для всех UITextView, которые перехватывали событие касания. Затем убедитесь, что tableView все еще будет получать касание.
Вы можете изменить это, чтобы перебирать другие UITableViews / UIScrollViews / UITextViews, которые также могут перехватывать.
Надеюсь это поможет!
У меня была та же проблема, но я исправил ее, выполнив следующие действия:
- Установите scrollsToTop = YES для просмотра таблицы, которую вы хотите прокрутить вверх.
- установите scrollsToTop = NO для всех других представлений таблицы или коллекции или просмотра прокрутки.
- Если какая-либо из ваших ячеек tableview имеет представление коллекции. Убедитесь, что вы установили scrollsToTop в NO для представления коллекции.
Если ваш контроллер представления / контроллер навигации добавлен в качестве подчиненного представления на другом контроллере представления, убедитесь, что вы установили его как дочерний контроллер.
addChildViewController()
был недостающей частью. Спасибо!
- person Pahnev; 16.03.2018
Я знаю, что это довольно старый, но надеюсь, что это может помочь. Следуя тому, что сказал @MarkGranoff, scrollsToTop не работает, если более чем для одного UIScrollView или его подклассов установлено значение YES (значение по умолчанию), вероятно, стоит проверить работоспособность, чтобы проверить, кто на самом деле испортил это поведение. Приведенный ниже простой метод перебирает подпредставления вашего представления и регистрирует значение scrollsToTop для всех UIScrollView в вашем представлении. Желательно вызывать в вашем методе viewDidAppear.
- (void)checkForScrollViewInView:(UIView *)view {
for (UIView *subview in [view subviews]) {
if ([subview isKindOfClass:[UIScrollView class]]) {
NSLog(@"scrollsToTop enabled: %i in scroll view %@", ((UIScrollView *)subview).scrollsToTop, subview);
}
if (subview.subviews.count > 0) {
[self checkForScrollViewInView:subview];
}
}
}
На самом деле это всего лишь отладочный код. Как только вы найдете значение scrollsToTop для каждого из подклассов UIScrollView, просто убедитесь, что только для одного установлено значение YES.
Как сказал Марк, у вас может быть только один подкласс UIScrollView (обычно табличное представление), у которого для свойства scrollsToTop установлено значение TRUE. Вероятно, у вас есть другие, обычно UITextView в вашем представлении. Просто установите для их свойства scrollsToTop значение FALSE, и все готово.
В заголовочном файле UIScrollView:
// Когда пользователь касается строки состояния, вид прокрутки под касанием, ближайшим к строке состояния, будет прокручен вверх, но только если его свойство
scrollsToTop
имеет значение YES, его делегат не возвращает NO изshouldScrollViewScrollToTop
, и это еще не наверху. // На iPhone мы выполняем этот жест, только если есть одно экранное представление прокрутки сscrollsToTop
== YES. Если найдено более одного, прокрутка не будет.
Может быть загружено несколько потомков UIScrollView, например: наличие UIPageViewcontroller на каждой странице, содержащей UITableViews.
Свойство scrollsToTop по умолчанию имеет значение true.
Таким образом, помимо обработки вложенного свойства scrollsToTop UIScrollViews, вы должны сделать следующее:
//When the view is loaded disable scrollsToTop, this view may not be the visible one
override func viewDidLoad() {
super.viewDidLoad()
...
tableView.scrollsToTop = false
}
//Now it's time to enable scrolling, the view is guaranteed to be visible
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
tableView.scrollsToTop = true
}
//Do not forget to disable scrollsToTop, making other visible UIScrollView descendant be able to be scrolled to top
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.tableView.scrollsToTop = false
}
Таким образом, только для scrollsToTop UITableView верхнего уровня будет установлено значение true.