【问题标题】:ScrollOffset in UIWebView?UIWebView中的ScrollOffset?
【发布时间】:2009-10-22 03:01:44
【问题描述】:

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

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

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

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

提前谢谢你!

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    要检索 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]; 唯一的问题可能是苹果代码检查不通过。我还不知道,因为我还在编码阶段。

    [更新] 带有此代码的应用程序在应用程序商店中已存在 4 个月,并被 40 000 名用户使用。我没有遇到任何问题[更新]

    【讨论】:

    • 我不明白为什么这不会通过:正在使用什么非公共 API?
    • 这样获取滚动视图有点难看。如果苹果希望我们使用它,我认为苹果会在 webview 上提供一个 scrollView 属性。但是,是的,我的应用已获得批准。
    • 我会假设滚动视图已经有一个委托集......或者可能在未来的 iOS 版本中。好像不是这样的?
    • @zekel 我使用这段代码有一段时间了,还没有看到任何副作用。我会说这是肯定的......但是是的,未来的 iOS 可能会改变一些事情。
    【解决方案2】:

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

    获取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 ]];

    【讨论】:

      【解决方案3】:

      我进行了修改以使用 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;
          }
      }
      

      【讨论】:

        【解决方案4】:

        老话题,我知道-

        从 iOS 5.0 开始,您可以使用

        myAccountWebView.scrollview
        

        访问内容大小和偏移量。

        【讨论】:

          【解决方案5】:

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

          1. 向 Apple 提交一个错误,要求他们公开更多 Web 视图的基础架构,或者至少添加一些委托方法,通过这些方法我们可以收到此类事件的通知。
          2. 向您的页面添加一些 JavaScript 代码,用于侦听滚动事件并通知您的应用。

          #2 的基本基础是加载一个虚假的 URL,并让您的 Web 视图委托进程(并中止!)加载。 (这个问题在 Stack Overflow 上出现过几次。)

          更新:

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

          【讨论】:

          • 谢谢,现在我已经为我需要做的事情找到了不同的界面解决方案。那么,有没有办法访问 UIWebViews UIScroller 并从中提取一些偏移量?
          • 没有记录/安全的方式,没有。我敢肯定,如果您使用调试器在 UIWebView 的视图层次结构中四处寻找,您可能会想出一些东西,但它可能随时中断。而且 Apple 不喜欢 App Store 中未记录的 API。 (OTOH,Web 视图中的 JavaScript API 有据可查且稳定......)
          • 它是一个 UIScrollView,你可以设置委托。没有错误。您将其分配给子视图并实现 ScrollViewDelegate。
          【解决方案6】:

          这是个好问题。 UIWebView 不是 UIScrollView 的子类,尽管我知道为什么有人会认为它是。这意味着使用 UIScrollViewDelegate 方法不是执行您想要的操作的选项,并且 UIWebViewDelegate 协议不会响应那些滚动事件类型的消息。我认为没有一种简单的方法可以检测 Web 视图中的滚动事件。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2019-11-10
              • 2011-08-25
              • 2013-11-26
              • 2013-11-07
              • 2013-11-14
              • 2011-04-14
              • 2014-02-06
              • 1970-01-01
              • 2023-04-04
              相关资源
              最近更新 更多