Не удается получить scrollsToTop, работающий на iOS7
Я ориентирую iOS7 в своем последнем приложении, и нажатие на строку состояния не похоже на прокрутку таблицыView или collectionView вверху.
Я установил self.tableView.scrollsToTop = true
и до сих пор ничего не происходит.
Я знаю, что Apple значительно изменила строку состояния в iOS7, но изменили ли эти изменения функциональность scrollsToTop
?
Обновление
В ответ на комментарий в одном из ответов я протестировал, чтобы убедиться, что мой просмотр коллекции действительно единственный scrollView на экране, и это было:
(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 NavigationController, где navigationBar прозрачен и применяет размытие к моей коллекции /tableViews при прокрутке вниз.
Обновление # 3
Выяснил это. Оказывается, у меня на экране было несколько прокрутки. Мое приложение имеет меню с левым ящиком под основной частью приложения, и в этом меню есть таблицаView для параметров. Я просто установил self.menuTable.scrollsToTop = false
, и все работало так, как ожидалось, в остальной части приложения. Не нужно было реализовывать методы делегирования прокруткиView или что-то еще.
Ответы
Ответ 1
Есть ли у вас более одного вида просмотра/просмотра/просмотра вида прокрутки на экране? Если это так, только один из них может scrollsToTop
установить на YES
, в противном случае iOS7 не будет прокручивать ни один из них вверху.
Вы также можете реализовать метод UIScrollViewDelegate scrollViewShouldScrollToTop:
и вернуть YES, если пройденное в прокрутке представление равно тому, которое вы хотите прокрутить вверху:
- (BOOL) scrollViewShouldScrollToTop:(UIScrollView*) scrollView {
if (scrollView == self.myTableView) {
return YES;
} else {
return NO;
}
}
Ответ 2
Короткий ответ: в iOS7 нет ничего другого. Пока загружено не более одного загруженного UIScrollView, ваш tableView или collectionView будут прокручиваться вверх, когда пользователь удаляет строку состояния. Ключ здесь загружен; другой scrollView не обязательно должен быть на экране, чтобы конфликтовать с другим scrollView, который есть.
Скользкие ящики слева/справа очень популярны в наши дни, и это стало причиной моей проблемы. У меня есть меню, содержащее мои параметры навигации, и все они хранятся в UITableView. Я должен был убедиться, что я установил menuTable.scrollsToTop = false
, прежде чем я смогу заставить все работать в других частях моего приложения.
Ответ 3
Моя проблема заключалась в том, что у меня был UITextView
с scrollsToTop
установлен на YES
, поэтому мой UITableView
не отвечал на жест. Короче говоря, проверьте все остальные прокручиваемые виды.
Ответ 4
для других:
Помните, что просмотр прокрутки, который вы ищете, также может быть UIWebView.. не только UITableView.
Еще одна важная вещь заключается в том, что это касается не только VISIBLE scrollViews, но и scrollviews LOADED.
Если вы не найдете scrollView, вы всегда можете
вставьте тестовую таблицу UITableView, сразу после запуска приложения, проверьте, прокручивается ли она вверх,
а затем загружать все больше и больше просмотров, пока тестовая таблица не перестанет прокручиваться вверх.
Ответ 5
Если ваши ячейки таблицы динамические, удалите следующее:
- (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];
Ответ 6
Это всегда работает для меня:
[self.tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];