scrollsToTop не работает, когда UIWebView используется с pushViewController в поисках решения

У меня есть приложение с табличным представлением в корне контроллера навигации, и при выборе ячейки таблицы он отображает новый контроллер представления, который содержит только UIWebView (с панелью инструментов и панелью навигации).

В зависимости от того, как я представляю новое веб-представление, функция, с помощью которой пользователь может нажать на строку состояния вверху и прокрутить веб-просмотр вверх, либо работает, либо не работает.

Если я использую:

  • (void) presentModalViewController: (UIViewController *) modalViewController анимированный: (BOOL) анимированный

в RootView, тогда веб-просмотр прокручивается вверх.

Если я изменю эту одну строку кода и вместо этого использую:

  • (void) pushViewController: (UIViewController *) viewController анимированный: (BOOL) анимированный

на контроллере навигации, функция scrollsToTop перестает работать.

Однако я действительно хочу использовать метод pushViewController по другим причинам в контексте приложения. НО, я также хочу сохранить поведение scrollsToTop.

До сих пор я пробовал различные подходы, некоторые из которых описаны здесь:

-Попытка установить внутреннее свойство scrollView scrollsToTop для веб-просмотра

((UIScrollView *)[[webView valueForKey:@"_internal"] valueForKey:@"scroller"]).scrollsToTop = YES;

(Нет заметного эффекта).

-Изменение порядка установки свойств NavBar или их полное отключение -Добавление дополнительных вызовов "window makeKeyAndOrderFront" после нажатия нового представления.

Я не верю, что есть другие представления, которые могли бы претендовать на свойство "scrollsToTop" (и первый тест, приведенный выше, в любом случае это доказывает).

Если не считать попытки встроить UIWebView в UIScrollView, что, как я ожидаю, будет болезненным, у меня закончились маршруты для изучения, чтобы решить эту проблему.

Я надеюсь, что кто-то еще нашел способ исправить это?


person theLastNightTrain    schedule 27.11.2009    source источник


Ответы (2)


Попробуйте обратный подход как обходной путь.

В контроллере корневого представления:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.tableView.scrollsToTop = NO;
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.tableView.scrollsToTop = YES;
}

Пока!

person muccy    schedule 07.12.2009
comment
Спасибо за ответ, muccy! Я вижу, куда вы идете, возможно, корневое представление со своей таблицей требует scrollsToTop! С большими надеждами попробовал, но, к сожалению, безрезультатно! :-( Большое спасибо за идею, и если у вас есть другие, не стесняйтесь их перебрасывать :) - person theLastNightTrain; 08.12.2009
comment
Это действительно странно. В приложении, которое я разрабатываю, у меня есть тот же сценарий (контроллер табличного представления - ›веб-представление [контроллер]), и у меня нет проблем с поведением строки состояния ... Если у меня возникнет идея, я без колебаний Предложить вам! :) - person muccy; 09.12.2009

Оказывается, это не сработало из-за того, как я настраивал навигационную панель. Я переопределял leftBarButtonItem с помощью UIBarButtonItem, который затем занимал всю навигационную панель (я думаю, что использовал этот подход из какого-то кода Apple много месяцев назад, но не уверен). Я использовал тот же подход в другом представлении, и scrollsToTop там отлично работал.

Взяв этот код и поместив пользовательское представление Navbar в (например) self.navigationController.titleView, вместо этого решила эту проблему. Я действительно не знаю почему, как я сказал, он отлично работает для других представлений.

Я потратил много времени на эту проблему, поэтому надеюсь, что спасу кого-то еще, описав ее здесь :)

person theLastNightTrain    schedule 27.01.2010