Прокрутите к началу UITableView, нажав строку состояния - PullRequest
57 голосов
/ 23 августа 2011

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

Ответы [ 9 ]

149 голосов
/ 23 августа 2011

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

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

31 голосов
/ 10 апреля 2013

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

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

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

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

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

6 голосов
/ 08 февраля 2014

Используя информацию, приведенную в других ответах, я добавил следующий код в свой 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 на всехUITextViews, которые перехватывали событие касания.Затем убедитесь, что tableView все еще будет получать прикосновение.

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

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

2 голосов
/ 21 августа 2015

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

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

1 голос
/ 26 августа 2016

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

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

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

Может быть несколько загруженных потомков 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 голосов
/ 03 декабря 2016

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

enter image description here

, вы должны сделать что-то подобное в viewDidLoad

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