UIScrollView + UIWebView = NO scrollsToTop - PullRequest
       9

UIScrollView + UIWebView = NO scrollsToTop

8 голосов
/ 01 февраля 2010

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

Я сделал простое тестовое приложение, чтобы увидеть, действительно ли это ошибка UIWebViews. И это действительно так.

//  scrolls to top on status bar tap 
UIScrollView *sv = [[UIScrollView alloc] init];
sv.frame = CGRectMake(0, 0, 320, 480);
sv.contentSize = CGSizeMake(320, 1200);
[self.view addSubview:sv];

// doesn't scroll
UIScrollView *sv = [[UIScrollView alloc] init];
sv.frame = CGRectMake(0, 0, 320, 480);
sv.contentSize = CGSizeMake(320, 1200);

UIWebView *wv = [[UIWebView alloc] init];
wv.frame = CGRectMake(0, 0, 320, 100);
[sv addSubview:wv]; 

[self.view addSubview:sv];

Итак, я думаю, что может быть что-то, что я мог бы отключить, чтобы UIWebView не связывался с scrollToTop? Или какой-то обходной путь также был бы хорош.

Есть идеи?

Ответы [ 4 ]

7 голосов
/ 25 февраля 2010

Я столкнулся с этим прошлой ночью, пока, наконец, не нашел ответ, похороненный в комментарии к комментарию. Идея этого оригинального сообщения заключается в том, что когда вы добавляете UIWebView в ваш UIScrollingView, вы используете следующее:

- (void) ensureScrollsToTop: (UIView*) ensureView {
    ((UIScrollView *)[[webView subviews] objectAtIndex:0]).scrollsToTop = NO;
}

Это показалось мне подозрительным, так как первый подвид UIWebView утверждает, что это UIScroller, который не является подклассом UIScrollView. Однако, поскольку UIScroller поддерживает свойство scrollsToTop, приведение просто дает нам возможность обойти предупреждение компилятора:

Class List:
    Class = UIScroller
    Class = UIView
    Class = UIResponder
    Class = NSObject
Supported Methods:
    ...
    Method _scrollToTop
    Method setScrollsToTop:
    Method scrollsToTop
    ...
Supported Properties:
    Property scrollsToTop

EDIT: Еще одно краткое замечание о том, где это на самом деле должно происходить: в обратном вызове webViewDidFinishLoad. Вызов его для построения UIWebView не достаточно хорош, потому что в то время UIWebView еще не создал свои дочерние представления, которые являются причиной возникновения проблемы:

- (void)webViewDidFinishLoad:(UIWebView *) wv {    
    [self ensureScrollsToTop: wv];
}

РЕДАКТИРОВАТЬ # 2:

теперь, в iOS 5, как отмечено в iPhone OS: после удаления / добавления назад не работает строка состояния, чтобы прокрутить вверх использовать новый @property scrollView UIWebView, что делает реализацию ensureScrollsToTop ненужной для проектов, которые не используют цели развертывания ниже iOS 5.0.

3 голосов
/ 06 сентября 2012

В iPhone OS, если в текущем viewController имеется более одного UIScrollView (или его подкласса, например UITableView, UIWebView), система не знает, какой UIScrollView следует прокрутить до самого верха.

Быстрое исправление: для всех UIScrollViews, которые вы не хотите поддерживать scrollsToTop, просто установите scrollsToTop как NO, тогда все будет работать идеально.

self.scrollView1.scrollsToTop = NO;
self.scrollView2.scrollsToTop = NO;
self.scrollView1.scrollsToTop = YES; // by default scrollsToTop is set as YES, this line is not necessary
0 голосов
/ 16 декабря 2016

Я хочу добавить свой случай, я добавляю UIWebView в UIScrollView, , как h4xxr сказал :

Если имеется более одного вида прокрутки, сообщение scrollViewDidScrollToTop игнорируется

Итак, я получил простой способ заставить его работать в webView: просто установите для свойства scrolllsToTop scrollView значение false.

А когда коснитесь строки состояния, она не будет перехвачена scrollView, а webView прокрутится до самого верха!

    UIScrollView *scrollView = [[UIScrollView alloc] init];
    scrollView.frame = self.view.bounds;
    scrollView.scrollsToTop = false; //igore scrollView`s scrollsToTop
    [self.view addSubview:scrollView];

    UIWebView *webView = [[UIWebView alloc] init];
    webView.frame = scrollView.bounds;
    [scrollView addSubview:webView];
0 голосов
/ 01 октября 2013

Веб-просмотры по умолчанию будут иметь значение YES для scrollsToTop-value.Я написал простой класс для этой конкретной проблемы.В моем приложении у нас есть несколько веб-просмотров и прокрутки.Это делает все это намного проще.

https://gist.github.com/hfossli/6776203

Он в основном устанавливает scrollsToTop равным NO на всех других scrollView, кроме того, который вы указываете.

...