Scroll WebView-用户已滚动

Scroll WebView-用户已滚动,scroll,webview,objective-c,Scroll,Webview,Objective C,我不知道如何让Objective-c中的WebView在制作滚动时进行检测。我查看了WebFrameLoadDelegate:并找到了didChangeLocationWithinPageForFrame:方法,但这似乎确实有效 您需要使用javascript检测webview是否正在滚动。如果您在“uiwebview javascript”上进行快速谷歌搜索,您将看到大量关于如何在uiwebivew中运行javascript的示例。一旦让javascript检测到发生的滚动,就有了javasc

我不知道如何让Objective-c中的WebView在制作滚动时进行检测。我查看了
WebFrameLoadDelegate:
并找到了
didChangeLocationWithinPageForFrame:
方法,但这似乎确实有效

您需要使用javascript检测webview是否正在滚动。如果您在“uiwebview javascript”上进行快速谷歌搜索,您将看到大量关于如何在uiwebivew中运行javascript的示例。一旦让javascript检测到发生的滚动,就有了javascript更改窗口。将位置更改为伪造的内容,并实现“webView:shouldStartLoadWithRequest:navigationType:”委托以执行objective-c代码。从委托方法返回否以不加载请求。

取决于您使用的是UIWebView(iOS-Cocoa Touch)还是WebView(OS X-Cocoa)

iOS(iOS 5及更高版本):

UIWebView公开其UIScrollView,您可以设置scroll视图的委托,然后实现委托scrollViewDidScroll:delegate方法(当然,首先添加到类的@interface声明中;此示例在UIViewController子类中):

OSX:

为WebView的NSViewBoundsIDChangeNotification添加观察者(此示例位于NSWindowController子类中):


在OS X上,您可以通过订阅
nsScrollViewWillStartiveScrollNotification
来检测它:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mySelector:)
  name:NSScrollViewWillStartLiveScrollNotification object:nil];
我将
nil
作为对象参数传递,因为当我得到它时,它看起来实际上并不是来自
WebView
上的
enclosingScrollView
。上没有滚动视图属性。因此,在处理它时,您必须检查是否是您的web视图发送了它(担心类型安全):

我只在
WebView
中尝试过这种后代检查方法,因此如果您使用的是
WKWebView
,请使用YMMV


NSViewBoundsIDChange从web视图的私有子视图而不是web视图本身触发。

NSViewBoundsIDChange中列出了其他滚动通知。无论何时发生任何滚动,而不仅仅是用户启动的。在运行Yosemite的Mac上,这似乎不适用于我。
- (id)initWithWindowNibName:(NSString *)windowNibName {
    self = [super initWithWindowNibName:windowNibName];
    if (self) {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                  selector:@selector(_scrollDetected)
                                                  name:NSViewBoundsDidChangeNotification
                                                  object:_webView];
    }
    return self;
}

- (void)_scrollDetected {
   // do something in response to scroll
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mySelector:)
  name:NSScrollViewWillStartLiveScrollNotification object:nil];
-(void)handleScroll:(id)sender
{
  if ([sender isKindOfClass:[NSNotification class]])
  {
    NSNotification *notif = (NSNotification *)sender;
    if ([notif.object isKindOfClass:[NSView class]])
    {
        NSView *view = (NSView *)notif.object;
        if ([view isDescendantOf:self.webView])
        {
           //Handle scroll here
        }
    }
  }
}