Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UIWebView中的滚动偏移?_Iphone_Objective C_Cocoa Touch - Fatal编程技术网

Iphone UIWebView中的滚动偏移?

Iphone UIWebView中的滚动偏移?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我很难理解委托和对象继承(如果我可以用这个词的话),我想我需要一件简单的事情:在UIWebView中捕获scrollViewDidScroll事件并获取偏移量(基本上,只是为了知道滚动是否不在顶部/底部,这样我就可以隐藏导航和选项卡栏) 我有什么办法可以做吗?我已经在视图控制器中使用UIWebviewDelegate来“shouldStartLoadWithRequest”。也许我也可以在scrollViewDidScroll中使用UIScrollViewDelegate?如果是的话,怎么办 我

我很难理解委托和对象继承(如果我可以用这个词的话),我想我需要一件简单的事情:在UIWebView中捕获scrollViewDidScroll事件并获取偏移量(基本上,只是为了知道滚动是否不在顶部/底部,这样我就可以隐藏导航和选项卡栏)

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

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

任何帮助或信息都会很好


提前谢谢你

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

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

  • 向Apple提交一个bug,要求他们公开更多web视图的基础结构,或者至少添加一些委托方法,通过这些方法我们可以收到此类事件的通知
  • 向您的页面添加一些JavaScript代码,用于侦听滚动事件,并向您的应用程序通知这些事件
  • <> 2基本的基础是加载一个假URL,并让你的Web视图委托过程(和中止!)加载。(关于堆栈溢出,这个问题在这里出现过几次。)

    更新:


    从iOS5开始,现在就有了一个自定义滚动行为的工具。web视图的确切视图层次结构仍然是一个未记录的实现细节,但这为您提供了一种经批准的方式来访问这部分内容。

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

    要获取页面偏移量,请执行以下操作: int pageYOffset=[[WebViewObjStringByEvaluatingJavaScriptFromString:@“window.pageYOffset”]intValue]

    要获取网页的总滚动高度,请执行以下操作: int-scrollHeight=[[WebViewObjStringByEvaluatingJavaScriptFromString:@“document.documentElement.scrollHeight”]intValue]

    要将网页滚动到特定偏移量,请执行以下操作:
    [webViewObj stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@“document.body.scrollTop=%d”,scrollHeight]

    要在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个月,有40000名用户使用。我没有遇到任何问题[UPDATE]

    我做了一个修改,用isKindOfClass检测类。工作-但可能有上述苹果代码检查问题

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

    我厌倦了委托方法,发现它在显示键盘时阻止了视图滚动。我发现,通过添加观察者,您不会覆盖当前委托,并且会阻止您影响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];
        }
    }
    
    旧线,我知道-

    从iOS 5.0开始,您可以使用

    myAccountWebView.scrollview
    

    访问内容大小和偏移量。

    谢谢,现在我已经为我需要做的事情提供了不同的界面解决方案。因此,没有任何方法可以访问UIWebViews UIScroller并从中提取一些偏移量?没有文档化/安全的方法,没有。我确信,如果您使用调试器查看UIWebView的视图层次结构,您可能会想出一些东西,但它可能随时会崩溃。苹果也不喜欢应用商店中未经记录的API。(OTOH,web视图中的JavaScript API有很好的文档和稳定的…)它是一个UIScrollView,您可以设置委托。没有bug。您将其分配给子视图并实现ScrollViewDelegate。我不明白为什么这不会通过:使用了什么非公共API?这样获得scrollview有点难看。我想,如果苹果想让我们使用它,他们会在webview上提供scrollView属性。但是是的,我的应用已经被批准了。我假设scrollview已经有了一个委托集。。。或者可能在未来的iOS版本中。似乎不是这样吗?@zekel我使用这段代码有一段时间了,还没有看到任何副作用。我想说这是肯定的。。。但是,是的,未来的iOS可以改变一切。