2010-11-12 6 views
19

обычно при нажатии на верхнюю часть экрана табличное представление прокручивается до самого верха. По какой-то причине это не работает в одном из моих контроллеров.Автоматический прокрутка вверх не работает в UITableView

hirarchy выглядит следующим образом:

UIView
-> WebView
-> TableView
-----> SearchBar
SearchDisplayController.

Я думаю, что все правильно подключено (источник данных, делегат, ...). У меня есть аналогичный контроллер, где все работает. Единственное отличие, по-видимому, в том, что WebView, который отсутствует в контроллере представления, где работает отвод и прокрутка к вершине ...

Любые идеи?

С наилучшими пожеланиями, Sascha

ответ

27

Вам нужно отключить scrollsToTop на все, кроме одного из прокручивать взглядов. Поскольку UITableView является потомком UIScrollView, это легко сделать. Однако, если вы хотите отключить его в веб-просмотре, это немного сложнее. Это похоже на работу:

[webView.subviews objectAtIndex:0].scrollsToTop = NO; 

Но это немного сомнительный, так как он копается в недокументированных частях WebView. Он может перестать работать, если Apple решит перестроить подпункты.

+1

Не могу ли я просто перечислить все подпункты, проверить, какой из них является подклассом прокрутки, и использовать код выше для всех соответствующих подсмотров? – Sascha

+1

Вот что я делаю (который должен даже продолжать, даже если компания Apple решит переставить подвидов): \t для (INT I = 0; я <[webView.subviews число]; я ++) { \t \t \t идентификатор подпанель = [webView.subviews objectAtIndex: i]; \t \t, если ([подвид isKindOfClass: [UIScrollView класс]]) \t \t { \t \t \t ((UIScrollView *) подпанель) .scrollsToTop = NO; \t \t} \t} – Sascha

+7

По состоянию прошивки 5, -scrollView свойства UIWebView [подвергается] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIWebView_Class/Reference/Reference. HTML # // apple_ref/ОКК/instp/UIWebView/Scrollview). –

3

Очевидно, если у вас есть более чем один вид прокрутки (в вашем случае WebView и Tableview) в контроллере представления, то «в строке состояния нажмите для прокрутки вверх» отключена.

http://twitter.com/drance/status/2448035250438144

(Matt Drance бывший евангелист iPhoneOS разработчик и текущий рокзвезда развитие IOS)

0

У меня была эта проблема только с табличным представлением в NIB. Очень разочаровываю, пока я не вспомнил, что я программно добавлял UITextView в качестве заголовка таблицы. scrollsToTop = НЕТ в UITextView сделал трюк.

30

Возможно, вы добавили некоторое представление в свою иерархию представлений, которая представляет собой UIScrollView или содержит виды прокрутки (например, UIWebView или UITextView). Когда вы нажимаете строку состояния, iOS ищет самую верхнюю прокрутку с scrollsToTop, установленную на YES и прокручивает ее вверх.

Добавьте это к классу:

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

... и называть

[self disableScrollsToTopPropertyOnAllSubviewsOf:myAddedSubview]; 

, чтобы решить эту проблему, и пусть ваш стол вид прокрутки вверх снова.

+1

Большое вам спасибо! Я не мог найти проблему, почему мой планшет не прокручивается, так как у меня было только два табличных виджета, и только один разрешен для прокруткиToTop. Используя эту функцию, я узнал, что было третье scrollview, которое я добавлял как subview. Я полностью забыл об этом! :) Благодаря!!!! –

+1

Не думал о подсчете UITextView. Благодарю. –

+0

Это действительно полезно для поиска проблемных подзапросов, спасибо! – ebi

0

Установить scrollsToTop = NO на все виды прокрутки в представлении, кроме тех, которые вы хотите прокрутить вверх. Это помогает системе найти правильный вид прокрутки.

1

Я просто хотел бы добавить к этому, если вы используете UITextView, это не то подвиды, которые нуждаются в scrollsToTop наладке, это фактическое UITextView, короче говоря вам нужен этот код:

[myTextView setScrollsToTop:FALSE]; 

Это должно устранить проблему (, кроме того, функция «disableScrollsToTopPropertyOnAllSubviewsOf» не работает в UITextViews).

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

4

Не знаю, что Apple курила, но по дизайну поведение на iPhone заметно отличается от iPad. Apple's documentation действительно включает примечание «Специальный Condsideration» следующим образом ...

На iPhone, жест прокрутки к вершине не имеет никакого эффекта, если есть больше чем один вид прокрутки на экране, который имеет scrollsToTop установлен ДА.

Так что на iPhone, вы должны убедиться, что есть только когда-либо один UIScrollView (или UITableView/UICollectionView/UIWebView и т.д.), который имеет свою scrollsToTop = YES.

Поскольку scrollsToTop по умолчанию для YES, вы должны явно установить scrollsToTop = NO для UIScrollView, который вы не хотите прокручивать, когда пользователь удаляет строку состояния.

3

Быстрый вариант ответа opyh. Поднимите его!

func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) { 
    for subview in view.subviews { 
     if let scrollView = subview as? UIScrollView { 
      (scrollView as UIScrollView).scrollsToTop = false 
     } 
     self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView) 
    } 
} 
Смежные вопросы