UIWebView中的ScrollOffset?

时间:2009-10-22 03:01:45

标签: iphone objective-c cocoa-touch

我很难理解委托和对象继承(如果我可以使用这个单词),我认为我需要一个简单的(或者我认为)的东西:在UIWebView中捕获scrollViewDidScroll事件并获得偏移(基本上,只是要知道滚动不在顶部/底部,所以我可以隐藏导航和标签栏。

我有什么方法可以做到吗?我已经在视图控制器中使用UIWebviewDelegate来“shouldStartLoadWithRequest”。也许我可以使用UIScrollViewDelegate如何使用scrollViewDidScroll?如果是,那怎么办?

我真的很难理解代表。我发布了一些文章,但实际上,我还是无法使用它们。

任何帮助或信息都很可爱。

提前谢谢!

7 个答案:

答案 0 :(得分:13)

要在UIWebView上检索滚动事件,我个人使用此代码来获取UIWebView内的滚动视图:

- (void) addScrollViewListener
{
    UIScrollView* currentScrollView;
    for (UIView* subView in self.myWebView.subviews) {
        if ([subView isKindOfClass:[UIScrollView class]]) {
            currentScrollView = (UIScrollView*)subView;
            currentScrollView.delegate = self;
        }
    }
}

它正在运作。您也可以使用它来呼叫[currentScrollView setContentOffset:offSet animated:YES];唯一的问题可能是没有通过Apple代码检查。我还不知道,因为我还处于编码阶段。

[更新]具有此代码的应用程序现在在应用商店中存在4个月,并由40,000个用户使用。我没有遇到任何麻烦[更新]

答案 1 :(得分:7)

您可以使用以下方法解决问题。

获取pageOffset:

int pageYOffset = [[webViewObj stringByEvaluatingJavaScriptFromString:@“window.pageYOffset”] intValue];

获取网页的总滚动高度:

int scrollHeight = [[webViewObj stringByEvaluatingJavaScriptFromString:@“document.documentElement.scrollHeight”] intValue];

用于将网页滚动到特定偏移量:

[webViewObj stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@“document.body.scrollTop =%d”,scrollHeight]];

答案 2 :(得分:4)

我做了一个修改,用isKindOfClass检测类。有效 - 但可能与上述Apple代码检查有关。

UIScrollView* currentScrollView;
for (UIView* subView in terms.subviews) {
    if ([subView isKindOfClass:[UIScrollView class]]) {
        NSLog(@"found scroll view");
        currentScrollView = (UIScrollView *)subView;
        currentScrollView.delegate = self;
    }
}

答案 3 :(得分:4)

旧线程,我知道 -

从iOS 5.0开始,您可以使用

myAccountWebView.scrollview

访问内容大小和偏移量。

答案 4 :(得分:2)

UIWebView中有一个滚动视图,但它a)不是UIScrollView,而b)是Apple认为是私有实现细节的东西(你也应该这样)。我只有两个建议:

  1. 向Apple提交一个错误,要求他们公开更多Web视图的基础结构,或者至少添加一些委托方法,以便我们通知这些事件。
  2. 向您的网页添加一些JavaScript代码,用于侦听滚动事件,并通知您的应用。
  3. #2的基本基础是加载虚假URL,并加载您的Web视图委托进程(并中止!)。 (这个问题在Stack Overflow上已经出现过几次了。)

    <强>更新

    从iOS 5开始,现在可以使用public scrollView property on UIWebView来自定义滚动行为。 Web视图的确切视图层次结构仍然是一个未记录的实现细节,但是这为您提供了一种获得批准的方法来访问它。

答案 5 :(得分:1)

这是一个很好的问题。 UIWebView不是UIScrollView的子类,虽然我可以看到为什么有人会认为它是。这意味着使用UIScrollViewDelegate方法不是执行所需操作的选项,UIWebViewDelegate协议不响应那些滚动事件类型的消息。我不认为在Web视图中检测滚动事件有一种简单的方法。

答案 6 :(得分:1)

我厌倦了委托方法,发现它在键盘显示时阻止了视图的滚动。我发现通过添加一个观察者,你不会覆盖当前的委托,并且会阻止你影响webview性能。

for (UIView* subView in myAccountWebView.subviews) {
    if ([subView isKindOfClass:[UIScrollView class]]) 
    {
        NSLog(@"found scroll view");
        [((UIScrollView*)subView) addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
    }
}