2010-02-01 52 views
8

它看起來像一個問題,可以有簡單的解決方案,但我還沒有找到任何可能導致它的方式。我在UIScrollView中使用UIWebView並點擊statusBar(將內容滾動到頂部)不起作用。UIScrollView + UIWebView = NO scrollsToTop

我做了簡單的測試應用程序,看看它是否真的是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?或者某種解決方法也很好。

任何想法?

回答

7

昨晚我跑到這裏,直到我終於找到了答案,埋在評論的評論。該idea of that original post是,當你添加一個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 

編輯:在webViewDidFinishLoad回調: 剛想中,這實際上需要另一個出現快速注。調用它的UIWebView建設是不夠的,因爲當時的UIWebView並沒有創造它的子視圖的是,這是造成問題的:

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

編輯#2:

現在,在iOS 5中,如iPhone OS: Tap status bar to scroll to top doesn't work after remove/add back中所述,使用UIWebView的新屬性scrollView,對於不使用低於iOS 5.0的部署目標的項目,不需要執行ensureScrollsToTop實現。

+0

謝謝nivekastoreth,這讓我煩惱。我只想指出,你錯過了'('in ensureScrollsToTop,我想提醒任何發現這個設置webview代理的人,以便webViewDidFinishLoad被調用。 – 2010-05-05 18:38:27

+0

這可以工作,但你可能意思是:((的UIScrollView *)[webView的子視圖] objectAtIndex:0])scrollsToTop = YES; – 2010-10-20 04:01:28

+0

我的這個內存是目前有點模糊,但我記得,這個問題是你需要scrollsToTop設置爲NO,因爲這個問題。如果多個滾動視圖返回YES(因爲它們通過子節點鏈接),它實際上會禁用該功能。只有-enabled-如果有且僅有一個滾動視圖返回YES。 – nivekastoreth 2010-11-30 01:36:14

3

在iPhone OS中,如果當前viewController中存在多個UIScrollView(或其子類,例如UITableView,UIWebView),則系統不知道應將哪個UIScrollView滾動到頂部。

快速修復:對於不想支持scrollsToTop的所有UIScrollView,只需將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

網頁視圖默認情況下,將有YES爲scrollsToTop價值。我爲這個特定的問題寫了一個簡單的類。在我的應用程序中,我們有多個網頁瀏覽和滾動視圖。這使得這一切變得更容易。

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

它基本上設置scrollsToTop到NO所有其他scrollViews比你指定一個。

0

我想補充我的情況,我在一個UIScrollView中添加一個UIWebView中,as h4xxr said

如果有一個以上的滾動視圖scrollViewDidScrollToTop該消息被忽略

所以,我得到一個簡單的方法,使其在webView上工作:只需將scrollView·s的scrollsToTop屬性設置爲false即可。

當點擊狀態欄,它那倒得到了由滾動視圖攔截,web視圖滾動到頂部!

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