2010-02-01 78 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]; 
相关问题