WKWebViewで、長押しメニューを表示させない方法
iOS8から使えるWKWebViewで、長押しした時に表示されるメニューを出ないようにするのに手こずったので、その経緯を書いておきます。
まず、UIWebViewの場合は、UIWebViewのサブクラスを作って、サブクラス内で、canPerformActionをオーバライドして、NOを返せば、メニューは表示されません。
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { return NO; }
が、WKWebViewでは、上記方法だとメニューが出ちゃいます。
UIMenuControllerのNotificationをキャッチして、UIMenuControllerのmenuVisibleをセットしても、一瞬メニューが表示されてしまいます。
なので、WKWebViewの場合は、CSSで対応することにしました。
(複雑な構成のページで、ちゃんと動作するかは怪しい)
// 選択禁止するCSS NSString *css = @"body{-webkit-user-select:none;-webkit-user-drag:none;}"; // CSSを読み込んだHTMLに適用するjavascript NSMutableString *javascript = [NSMutableString string]; [javascript appendString:@"var style = document.createElement('style');"]; [javascript appendString:@"style.type = 'text/css';"]; [javascript appendFormat:@"var cssContent = document.createTextNode('%@');", css]; [javascript appendString:@"style.appendChild(cssContent);"]; [javascript appendString:@"document.body.appendChild(style);"]; // javascriptをページ読み込み完了時に毎回実行するよう設定 WKUserScript *noneSelectScript = [[WKUserScript alloc] initWithSource:javascript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES]; WKUserContentController *userContentController = [[WKUserContentController alloc] init]; [userContentController addUserScript:noneSelectScript]; WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; configuration.userContentController = userContentController; // WKWebViewのイニシャライズ WKWebView *webView = [[WKWebView alloc] initWithFrame:frame configuration:configuration];
本当は、辞書メニューと、追加のカスタムメニューだけ出して、コピーメニューとかは非表示にするのがゴールだったのですが、コピーメニューが、どうやっても消せずに断念。。
どなたか知っている人がいれば教えて下さい。m(_ _)m