元の wkwebview アクションシートをオーバーライドしようとしました...
まず、元のwkactionsheetを無効にしました webView.evaluateJavaScript("document.body.style.webkitTouchCallout='none';", completionHandler: nil)
次に、長押しジェスチャ レコグナイザを初期化し (完全に機能します)、独自のアクション シートを作成しました。クリックされたリンクの URL を取得するために、decisionPolicyForNavigationAction を使用しました。
func onLongPress(gestureRecognizer:UIGestureRecognizer){
if gestureRecognizer.state == UIGestureRecognizerState.Began {
longPressSwitch = true
}
}
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
if(navigationAction.navigationType == .LinkActivated) {
longPressAcUrl = navigationAction.request.URL!.absoluteString
if(longPressSwitch == true) {
let ac = actionMenu(self)
self.presentViewController(ac, animated: true) {
}
decisionHandler(.Cancel)
longPressSwitch = false
}
}
decisionHandler(.Allow)
}
問題は、指が離された後にアクション シートが表示されることです (つまり、recogniser.state = .Ended) が、ユーザーがリンクを押してから 0.5 秒以内に Chrome のように表示されるようにしたいのですが... (つまり、recogniser.state = .Begin)、どうすればよいですか?
ps: これは私のアクション シートです。
//Rebuild Wkactionsheet
func actionMenu(sender: UIViewController) -> UIAlertController {
let alertController = UIAlertController(title: "", message: longPressAcUrl, preferredStyle: .ActionSheet)
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in
}
alertController.addAction(cancelAction)
let openAction = UIAlertAction(title: "Open", style: .Default) { (action) in
//...
}
alertController.addAction(openAction)
let opentabAction = UIAlertAction(title: "Open in New Tab", style: .Default) { (action) in
//...
}
alertController.addAction(opentabAction)
let copyurlAction = UIAlertAction(title: "Copy Link URL", style: .Default) { (action) in
//...
}
alertController.addAction(copyurlAction)
return alertController
}
また、私が入れようとした場合
let ac = actionMenu(self)
self.presentViewController(ac, animated: true) {}
onLongPress() では、navigationAction.request.URL!.absoluteString! から URL (longPressAcUrl) を取得できませんが、正常に動作します。