Не удается заставить scrollsToTop работать на iOS7

Я ориентируюсь на iOS7 в своем последнем приложении, и нажатие на строку состояния, похоже, не прокручивает tableView или collectionView вверх.

Я установил self.tableView.scrollsToTop = true, но ничего не происходит.

Я знаю, что Apple значительно изменила строку состояния в iOS7, но не нарушили ли эти изменения функциональность scrollsToTop?

Обновить

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

(lldb) po [self.view recursiveDescription]
<UIView: 0x1092ddf0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x109357e0>>
   | <UICollectionView: 0x11351800; frame = (0 0; 320 568); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x10966080>; layer = <CALayer: 0x109623a0>; contentOffset: {0, -64}> collection view layout: <UICollectionViewFlowLayout: 0x10940a70>
   |    | <UIImageView: 0x10965fa0; frame = (0 564.5; 320 3.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x10965ee0>> - (null)
   |    | <UIImageView: 0x10948f60; frame = (316.5 561; 3.5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x10966030>> - (null)

Обновление №2

Не уверен, что это имеет значение, но я использую стандартный навигационный контроллер iOS7, где панель навигации прозрачна и применяет размытие к моей коллекции/таблице, когда они прокручиваются внизу.

Обновление №3

Догадаться. Оказывается, у меня действительно было более одного scrollView на экране. В моем приложении есть меню левого ящика под основной частью приложения, и в этом меню есть tableView для параметров. Я просто установил self.menuTable.scrollsToTop = false, и все остальное приложение работало, как и ожидалось. Не нужно было реализовывать методы scrollView Delegate или что-то в этом роде.


person djibouti33    schedule 27.09.2013    source источник
comment
Вам нужно установить что-то вроде self.scrollView.scrollEnabled = YES; ? Но для таблицы..   -  person DogCoffee    schedule 28.09.2013
comment
Отличное предложение в обновлении №3, получилось точно так же. Но странным было то, что без исправления обновления №3 он работал в iOS8, но не в iOS7.   -  person MANIAK_dobrii    schedule 09.12.2014


Ответы (6)


У вас есть более одного представления прокрутки/представления таблицы/коллекции на экране? Если это так, только один из них может иметь scrollsToTop установите значение YES, иначе iOS7 не будет прокручивать ни один из них вверх.

Вы также можете реализовать метод UIScrollViewDelegate scrollViewShouldScrollToTop: и вернуть YES, если переданное представление прокрутки равно тому, которое вы хотите прокрутить вверх:

- (BOOL) scrollViewShouldScrollToTop:(UIScrollView*) scrollView {
    if (scrollView == self.myTableView) {
        return YES;
    } else {
        return NO;
    }
}
person Greg    schedule 27.09.2013
comment
Насколько я могу судить, у меня есть tableView только в одном конкретном контроллере представления и collectionView в другом. Я установил для обоих значение scrollsToTop = true и реализовал предложенный вами метод делегата прокрутки. Я бросил оператор журнала вверху, и этот метод никогда не вызывается. Пробовал на тренажере и аппарате. - person djibouti33; 28.09.2013
comment
Видны ли оба этих представления контроллера одновременно? - person Greg; 28.09.2013
comment
извините за путаницу. это две совершенно разные части приложения. - person djibouti33; 28.09.2013
comment
Есть ли на экране какие-либо другие представления прокрутки (или подклассы представления прокрутки, такие как представление таблицы или представление коллекции)? Как говорится в документах Apple, на iPhone жест прокрутки вверх не действует, если на экране есть более одного вида прокрутки, для которого для scrollsToTop установлено значение YES. - person Greg; 28.09.2013
comment
нет, мой вид коллекции единственный. ознакомьтесь с обновлением моего вопроса, где я публикую результат [self.view recursiveDescription] - person djibouti33; 28.09.2013
comment
ах-ха - у меня действительно была ТОЧНО эта проблема в приложении, которое я создал (выдвижной ящик с табличным представлением и основной вид с табличным представлением). Рад, что это работает для вас сейчас! - person Greg; 28.09.2013
comment
давайте продолжим это обсуждение в чате - person Greg; 29.09.2013

Короткий ответ: в iOS7 нет ничего другого. Пока загружено не более одного UIScrollView, ваш tableView или collectionView будет прокручиваться вверх, когда пользователь касается строки состояния. Ключ здесь загружен; другой scrollView не обязательно должен быть на экране, чтобы конфликтовать с другим scrollView.

Выдвижные ящики слева/справа очень популярны в наши дни, и это стало причиной моей проблемы. У меня есть меню, содержащее параметры навигации, и все они хранятся в UITableView. Я должен был убедиться, что я установил menuTable.scrollsToTop = false, прежде чем я смогу заставить что-то работать в других частях моего приложения.

person djibouti33    schedule 01.10.2013
comment
Да! Это сделало это для меня! :D - person Mihai Fratu; 01.10.2014
comment
Спасибо! Вы спасли мой день :) - person Nikant; 16.01.2016
comment
Это, безусловно, сэкономит мое время. - person pkc456; 13.05.2016

Моя проблема заключалась в том, что у меня был UITextView с scrollsToTop, установленным на YES, поэтому мой UITableView не реагировал на жест. Короче говоря, сделайте проверку всех других прокручиваемых представлений.

person Jeffrey Sun    schedule 06.08.2014

для других :

Помните, что вид прокрутки, который вы ищете, также может быть UIWebView, а не только UITableView. Еще одна важная вещь заключается в том, что речь идет не только о ВИДИМЫХ прокрутках, но и о ЗАГРУЖЕННЫХ прокрутках.

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

person user1105951    schedule 30.01.2014

Если ячейки вашей таблицы являются динамическими, удалите следующее:

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
    return YES;
}

Создайте новую функцию следующим образом:

- (void) disableScrollsToTopPropertyOnAllSubviewsOf:(UIView *)view {
    for (UIView *subview in view.subviews) {
        if ([subview isKindOfClass:[UIScrollView class]]) {
            ((UIScrollView *)subview).scrollsToTop = NO;
        }
        [self disableScrollsToTopPropertyOnAllSubviewsOf:subview];
    }
}

Вызов функции выше в - (void)viewDidLoad

[self disableScrollsToTopPropertyOnAllSubviewsOf:self.view];

Теперь включите ScrollsToTop для вашего табличного представления следующим образом:

[myTableView setScrollsToTop:YES];
person AshMan    schedule 03.09.2015

Это всегда работает для меня:

[self.tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
person Pauls    schedule 19.11.2014