Not Null

iOSアプリ開発者のブログ

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