3

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

首先,我禁用了原来的 wkactionsheet webView.evaluateJavaScript("document.body.style.webkitTouchCallout='none';", completionHandler: nil)

然后我初始化一个长按手势识别器(它工作得很好)并创建了我自己的操作表。我使用了 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!.absoluteString 获取 URL (longPressAcUrl),但它工作正常!

4

1 回答 1

0

首先,没有必要模仿 Chrome 的行为,因为对整个体验几乎没有影响。事实上,你可以推测在手指松开后显示它的方法比 Chrome 和 Safari 所做的更好。

为什么?

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

我相信 Safari 会在用户按下时显示操作表,以给人一种一切都在快速发生的错觉。

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

(目标-C)

使用 UIGestureRecognizerStateBegan

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

于 2017-01-12T13:16:42.177 回答