wkwebview decisionPolicyForNavigationAction在长按识别器结束后调用

时间:2016-02-19 07:43:56

标签: ios swift uigesturerecognizer wkwebview uilongpressgesturerecogni

我试图覆盖原来的wkwebview动作表......

首先,我按webView.evaluateJavaScript("document.body.style.webkitTouchCallout='none';", completionHandler: nil)

禁用原始wkactionsheet

然后我初始化一个长按手势识别器(它完美地工作),我创建了自己的操作表。我使用了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),但我希望它显示为Chrome,用户按下链接后应为0.5秒或更短时间。 ..(即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获取URL(longPressAcUrl)!.absoluteString!

1 个答案:

答案 0 :(得分:0)

首先,没有必要模仿Chrome的行为,因为对整个体验几乎没有任何影响。事实上,人们可以理解你手指释放后出现的方法比Chrome和Safari正在做的更好。

为什么?

因为您使用的标准长按识别的标准行为在整个生态系统中无所不在。

我相信Safari正在显示操作表,而用户正在按下以表示一切都在发生的错觉 FAST

无论如何,您可以通过创建自定义UIWindow来“修复”此问题,实现您自己的长按识别并使用保存的坐标获取HTML的元素。有关如何创建此完整行为的指南,请检查以下链接:http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/comment-page-3/

<击>(目标C)

使用UIGestureRecognizerStateBegan

一般错误:网站将绕过政策决定,并在触摸结束时加载内容。