我无法弄清楚如何在进行滚动时在Objective-c中检测WebView。我查看了WebFrameLoadDelegate:
并找到了didChangeLocationWithinPageForFrame:
方法,但这似乎确实有效。
答案 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中列出了其他滚动通知。