WebView - 用户已滚动

时间:2010-06-22 05:24:01

标签: scroll webview objective-c

我无法弄清楚如何在进行滚动时在Objective-c中检测WebView。我查看了WebFrameLoadDelegate:并找到了didChangeLocationWithinPageForFrame:方法,但这似乎确实有效。

3 个答案:

答案 0 :(得分:2)

您需要使用javascript检测webview是否正在滚动。如果你在“uiwebview javascript”上进行快速谷歌搜索,你会看到很多关于如何在uiwebivew中运行javascript的例子。一旦你得到javascript来检测滚动发生然后你有javascript更改window.location到假的东西并实现“webView:shouldStartLoadWithRequest:navigationType:”委托来执行objective-c代码。从委托方法返回NO以不加载请求。

答案 1 :(得分:1)

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

iOS(iOS 5及更高版本):

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

- (void)viewDidLoad {
   [super viewDidLoad];
   [_webView.scrollView setDelegate:self];
}

#pragma mark UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // do something in response to scroll
    }
}

OS X:

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

- (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
}

答案 2 :(得分:0)

在OS X上,您可以通过订阅NSScrollViewWillStartLiveScrollNotification

来检测它
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mySelector:)
  name:NSScrollViewWillStartLiveScrollNotification object:nil];

我将nil作为对象参数传递,因为当我得到它时,它实际上并不是来自enclosingScrollView上的WebView。并且WKWebView in Yosemite上没有滚动视图属性。所以在处理它时,你必须检查它是否是你的网页视图发送它(对类型安全是偏执的):

-(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
        }
    }
  }
}

我只使用WebView尝试了这种后代检查,所以如果你使用WKWebView,YMMV。

NSScrollView documentation中列出了其他滚动通知。