it-swarm.com.ru

Прокрутите к началу UITableView, нажав строку состояния

Я знаю, что есть тонны кода для прокрутки табличного представления к вершине, но я хочу сделать это, когда верхняя строка состояния будет нажата, как в родных приложениях Apple. Это возможно?

57
Chase

Вы получаете это бесплатно, но вы должны убедиться, что атрибут scrollsToTop вашего UITableView равен YES.

Когда это НЕ работает, когда у вас есть объект UIScrollView (или класс-потомок, такой как UITextView), встроенный в другой класс UIScrollView (например, UITableView). В этом случае установите scrollsToTop во встроенном классе UIScrollView в значение NO. Тогда поведение тап-статус-бар будет работать.

148
Mark Granoff

Если вы пришли из Google и вам нужен полный контрольный список:

  1. Убедитесь, что вы установили scrollsToTop = YES (согласно предложению Марка) в вашем UITableView
  2. Убедитесь, что вы установили scrollsToTop = NO для всех ДРУГИХ UITableViews/UIScrollViews/UITextViews в вашем окне, чтобы они не перехватывали щелчок. Я обнаружил, что распечатывал все представления в моем окне много раз, чтобы отладить это ...
  3. Убедитесь, что ваш вид таблицы находится в пределах 0/0 (координаты х/у) в пределах окна - это то, как система знает, что она должна передать сообщение
31
Zane Claes

Используя информацию, приведенную в других ответах, я добавил следующий код в свой UITableViewController, чтобы он заработал:

- (void) viewDidLoad 
 {
 [super viewDidLoad]; 

 для (UITextView * представление в self.view.subviews) {
 if ([view isKindOfClass: [UITextView class]]) {
 view.scrollsToTop = NO; 
 } 
 } 

 self.tableView.scrollsToTop = YES; 
} 

Это просматривает все представления в иерархии UITableViewController и отключает scrollsToTop на всех UITextViews, которые перехватывали событие касания. Затем удостоверился, что tableView все еще будет получать прикосновение.

Вы можете изменить это, чтобы перебирать другие UITableViews/UIScrollViews/UITextViews, которые также могут перехватывать.

Надеюсь это поможет!

6
Brandon Roberts

У меня была та же проблема, но исправлена ​​с помощью следующих шагов:

  1. Установите scrollsToTop = YES для таблицы, которую вы хотите прокрутить вверх.
  2. set scrollsToTop = NO для всех других табличных представлений, коллекций или скроллвидов.
  3. Если любая из ваших ячеек табличного представления имеет представление коллекции. Убедитесь, что вы также установили scrollsToTop в NO для представления коллекции.

Если ваш контроллер представления/контроллер навигации добавлен как подпредставление на другом контроллере представления, убедитесь, что вы установили его как дочерний контроллер.

6
iOS Developer

Я знаю, что это довольно старый, но надеюсь, что это может помочь. Следуя тому, что сказал @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.

2
DennyLou

Как сказал Марк, у вас может быть только один подкласс UIScrollView (обычно табличное представление), у которого свойство scrollsToTop установлено в значение TRUE. Скорее всего, у вас есть другие, как правило, UITextView на ваш взгляд. Просто установите для свойства scrollsToTop значение FALSE, и все готово.

2
George

В заголовочном файле UIScrollView:

// Когда пользователь касается строки состояния, представление прокрутки под касанием, которое находится ближе всего к строке состояния, будет прокручено вверх, но только если его свойство scrollsToTop равно YES, его делегат не возвращает NO из shouldScrollViewScrollToTop, и это не уже на вершине . // На iPhone мы выполняем этот жест, только если есть одно экранное представление прокрутки с scrollsToTop == YES. Если найдено более одного, ни один из них не будет прокручен.

1
foskon

Может быть несколько потомков 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.

0
Géza Mikló

Например, если у вас есть табличное представление и представление прокрутки как теги как это

 enter image description here

вы должны сделать что-то вроде этого в viewDidLoad

self.tableView.scrollsToTop = true
self.tagsView.scrollsToTop = false
0
Abo3atef