UIScrollView + UIWebView =没有scrollsToTop

时间:2010-02-01 07:36:15

标签: iphone uiwebview uiscrollview

它看起来像一个可以有简单解决方案的问题,但我没有找到任何可能导致它的方法。我在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?或者某种解决方法也不错。

有什么想法吗?

4 个答案:

答案 0 :(得分: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的新@property scrollView,对于未使用低于iOS 5.0的部署目标的项目,不需要ensureScrollsToTop实现。

答案 1 :(得分:3)

在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

答案 2 :(得分:0)

默认情况下,对于scrollsToTop-value,Webview具有YES。我为这个特定问题编写了一个简单的类。在我的应用中,我们有多个网页浏览量和滚动视图。这使得一切变得容易。

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

它基本上将所有其他scrollView上的scrollsToTop设置为NO,而不是您指定的那个。

答案 3 :(得分:0)

我想添加我的案例,我在UIScrollView上添加了一个UIWebView as h4xxr said

  

如果有多个滚动视图,则忽略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];