3

元の 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) を取得できませんが、正常に動作します。

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/

(Objective-C)

UIGestureRecognizerStateBegan を使用する

一般的なバグ: Web サイトはポリシーの決定をバイパスし、タッチが終了するとコンテンツをロードします。

于 2017-01-12T13:16:42.177 に答える