2010-06-22 46 views
2

我無法弄清楚如何在進行滾動時在Objective-c中檢測WebView。我看過WebFrameLoadDelegate:,發現didChangeLocationWithinPageForFrame:方法,但這似乎工作。WebView - 用戶已滾動

回答

2

你會想檢測webview是通過使用JavaScript滾動。如果你在「uiwebview javascript」上做了一個快速的谷歌搜索,你會看到很多關於如何在uiwebivew上運行javascript的例子。一旦你得到javascript來檢測滾動發生,那麼你有JavaScript的變化window.location的東西假,並實現「webView:shouldStartLoadWithRequest:navigationType:」委託執行Objective-C代碼。從委託方法返回NO以不加載請求。

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:

添加觀察者的web視圖的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 
} 
+0

NSViewBoundsDidChange從Web視圖的私有子視圖中觸發,而不是Web視圖本身。而且每當發生任何滾動時,不僅僅是用戶發起的。在運行Yosemite的Mac上,這似乎不適用於我。 – 2014-12-31 18:29:07

0

在OS X,你可以通過訂閱NSScrollViewWillStartLiveScrollNotification檢測它:

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

我通過nil爲對象的參數,因爲當我得到它,它不會出現真正來自enclosingScrollViewWebView上。 WKWebView in Yosemite上沒有滾動視圖屬性。所以在搬運時,你必須檢查它是否在發送你的Web視圖(是偏執型安全):

-(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中列出了其他滾動通知。