2010-02-01 13 views
8

Es sieht aus wie ein Problem, das eine einfache Lösung haben könnte, aber ich habe nichts gefunden, was den Weg dorthin führen könnte. Ich benutze UIWebView innerhalb von UIScrollView und tippen auf statusBar (um Inhalt nach oben scrollen) funktioniert nicht.UIScrollView + UIWebView = Nein scrollsToTop

Ich habe einfache Testanwendung gemacht, um zu sehen, ob es wirklich UIWebViews Fehler ist. Und das ist es wirklich.

// 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]; 

Also, ich denke, vielleicht gibt es etwas, das ich deaktivieren könnte UIWebView nicht zu verwirren mit scrollToTop zu machen? Oder eine Art Workaround wäre auch nett.

Irgendwelche Ideen?

Antwort

7

Ich lief in dieser letzten Nacht, bis ich endlich die Antwort in einem Kommentar zu einem Kommentar begraben gefunden. Die idea of that original post ist, dass, wenn Sie die UIWebView zu Ihrem UIScrollingView hinzuzufügen, verwenden Sie die folgenden Schritte aus:

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

Dies schien seit dem ersten Teilansicht einer UIWebView mir fischig behauptet, ein UIScroller zu sein, das ist nicht eine Unterklasse von UIScrollView. Da jedoch UIScroller die scrollsToTop Eigenschaft unterstützt, die Besetzung gibt uns nur einen Weg vorbei an der Compiler-Warnung:

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

EDIT: Nur eine weitere kurze Notiz darüber, wo diese tatsächlich benötigen auftreten: in dem webViewDidFinishLoad Rückruf. es auf UIWebView Bau Aufruf ist nicht gut genug, weil zu diesem Zeitpunkt die UIWebView nicht erstellt hat es Kind Blick ist noch, was diejenigen, die das Problem verursacht sind:

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

EDIT # 2:

jetzt, Verwenden Sie in iOS 5, wie in iPhone OS: Tap status bar to scroll to top doesn't work after remove/add back erwähnt, die neue @property scrollView von UIWebView, wodurch die Implementierung ensureScrollsToTop für Projekte, die keine Implementierungsziele unter iOS 5.0 verwenden, unnötig wird.

+0

Dank nivekastoreth, das war nervig mich. Ich möchte nur darauf hinweisen, dass Sie eine '(' in secureScrollsToTop fehlt und ich möchte jemand anderen daran erinnern, der dies findet, um den Delegaten der Webansicht zu setzen, so dass webViewDidFinishLoad aufgerufen wird. –

+0

dies funktioniert, aber Sie wahrscheinlich gemeint: ((UIScrollView *) [[webview subviews] objectAtIndex: 0]). ScrollsToTop = YES; –

+0

Meine Erinnerung daran ist im Moment etwas unscharf, aber das Problem ist, dass Sie scrollsToTop auf NO setzen müssen, weil das Problem Wenn mehrere Scroll-Ansichten YES zurückgeben (wenn sie sich durch untergeordnete Elemente ketten), wird diese Funktionalität tatsächlich deaktiviert.Es ist nur möglich, wenn nur eine Scroll-Ansicht YES zurückgibt. – nivekastoreth

3

Wenn in iPhone OS mehr als ein UIScrollView (oder seine Unterklasse, z. B. UITableView, UIWebView) im aktuellen viewController vorhanden ist, weiß das System nicht, welcher UIScrollView nach oben gescrollt werden soll.

Schnellkorrektur: Für alle UIScrollViews, die scrollsToTop nicht unterstützen möchten, setzen Sie scrollsToTop einfach auf NO, dann funktioniert alles perfekt.

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

Webviews wird standardmäßig YES für scrollsToTop-Wert haben. Ich habe eine einfache Klasse für dieses spezielle Problem geschrieben. In meiner App haben wir mehrere Webviews und Scrollviews. Das macht alles viel einfacher.

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

Es setzt im Grunde scrollsToTop zu NO auf allen anderen scrollViews als die, die Sie angeben.

0

ich meinen Fall hinzufügen möge, füge ich eine UIWebView auf einem UIScrollView, as h4xxr said:

Wenn es mehr als eine Scroll-Ansicht ist eine scrollViewDidScrollToTop Nachricht

So ignoriert wird, erhalte ich Ein einfacher Weg, um es mit WebView zu arbeiten: Setzen Sie einfach die scrollsToTop Eigenschaft scrollView false.

Und wenn Sie auf die Statusleiste tippen, wird sie nicht von scrollView abgefangen, und der WebView scrollt nach oben!

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];