簡體   English   中英

UIScrollView + UIWebView =沒有scrollsToTop

[英]UIScrollView + UIWebView = NO scrollsToTop

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

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

有任何想法嗎?

我昨晚遇到了這個問題,直到我終於在評論評論中找到了答案。 原始帖子想法是,當您將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中所述:在刪除/添加后使用UIWebView的新@property scrollView, 點擊狀態欄滾動到頂部不起作用 ,這使得對於未使用低於部署目標的項目不需要使用ensureScrollsToTop實現iOS 5.0。

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

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

對於scrollsToTop-value,Web視圖默認為YES 我為這個特定問題編寫了一個簡單的類。 在我的應用中,我們有多個網頁瀏覽量和滾動視圖。 這使得一切變得容易。

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

它基本上將scrolllsToTop設置為所有其他scrollViews上的NO ,而不是您指定的那個。

我想添加我的案例,我在UIScrollView上添加了一個UIWebView, 正如h4xxr所說

如果有多個滾動視圖,則忽略scrollViewDidScrollToTop消息

所以,我得到一個簡單的方法使它在webView上工作:只需將scrollView的scrolllsToTop屬性設置為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];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM