62

WKWebView の iOS 実装で「ピンチしてズーム」拡大ジェスチャを無効にする方法を探しています。OS X で利用可能な倍率 BOOL プロパティがありますが、iOS では利用できないようです。

WKWebView.h

#if !TARGET_OS_IPHONE
/* @abstract A Boolean value indicating whether magnify gestures will
 change the web view's magnification.
 @discussion It is possible to set the magnification property even if
 allowsMagnification is set to NO.
 The default value is NO.
 */
@property (nonatomic) BOOL allowsMagnification;

また、WKWebView のジェスチャ レコグナイザーを調べてみましたが、空の配列になっているようです。実際のレコグナイザーはコンポーネントの構造の奥深くに埋め込まれており (見た目からしてかなり複雑です)、可能であればそれらを掘り下げたくないと思います。

ジェスチャの起動を潜在的に無効にする可能性のあるハック (ジェスチャを WebView に選択的に渡す、ピンチ ジェスチャをキャプチャするための子ビューを追加するなど) を知っていますが、それらがイベントにラグを導入することを常に発見しており、実装をそのまま維持したいと考えています。可能な限りクリーン/ハックフリー。

4

21 に答える 21

24

Swift で WkWebView のズームを無効にする作業コードを完成させます。

import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate {
    var webView : WKWebView!

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration:webConfiguration)
        webView.uiDelegate = self

        let source: String = "var meta = document.createElement('meta');" +
            "meta.name = 'viewport';" +
            "meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" +
            "var head = document.getElementsByTagName('head')[0];" + "head.appendChild(meta);";

        let script: WKUserScript = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
        webView.configuration.userContentController.addUserScript(script)

        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let myUrl = URL(string: "https://www.google.com")

        let myRequest = URLRequest(url: myUrl!)
        webView.load(myRequest)
    }
}
于 2018-05-03T12:43:51.327 に答える
15

Landschaftの回答の完全なSwift 3 / iOS 10バージョン:

import UIKit
import WebKit

class MyViewController: UIViewController, UIScrollViewDelegate {

    var webView = WKWebView()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(webView)
        webView.scrollView.delegate = self
    }

    // Disable zooming in webView
    func viewForZooming(in: UIScrollView) -> UIView? {
        return nil
    }
}
于 2017-03-02T16:25:33.790 に答える
3

スイフト2.0

extension WKWebView {
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        return nil
    }
}
于 2016-02-09T19:43:05.737 に答える
2

これは、 1つのWebViewのみのアプリでSwift3ビューコントローラーのズームを無効にした方法です

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, UIScrollViewDelegate {

    @IBOutlet var webView: WKWebView!

    override func loadView() {
        webView = WKWebView()
        webView.navigationDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        webView.scrollView.delegate = self
    }

    func viewForZooming(in: UIScrollView) -> UIView? {
        return nil;
    }    

}
于 2017-08-18T20:47:59.407 に答える
2

HTML 内のリンクを処理することが重要でない場合 (たとえば、テキストのみを表示したい場合)、最も簡単な方法は、ユーザーの操作を無効にすることです。 webView.userInteractionEnabled = false

于 2016-07-13T09:36:57.040 に答える
1

回答にコメントを追加するのに十分な評判はありませんが、Kevin のソリューション (メタ ビューポート) が iOS 10 ベータ版では機能しなくなったことに言及したいと思います。しかし、ランドシャフトのソリューションは私にとってはうまくいっています!

JS ソリューションは W3C 標準を使用するため、常にサポートする必要があります。

ああ、ケビン、私はこれらがどのように機能したかを願っています。

詳細はこちら: https://stackoverflow.com/a/37859168/1389714

于 2016-07-11T17:15:26.837 に答える