2014-08-28 135 views
32

我正在尋找一種方法來禁用「指縮放」放大手勢在iOS實施WKWebView的。有一個可用於OS X的放大BOOL屬性,但它似乎不適用於iOS。停用放大手勢WKWebView

WKWebView.h

​​

我,也試過看WKWebView的手勢識別,但似乎被調高空數組。我假設實際的識別器在組件的結構中受到更深的保護(相當複雜,通過它的外觀),並且如果可能的話,寧可不去挖掘它們。

我知道可能的黑客可能會禁用觸發手勢(有選擇地將手勢傳遞給WebView,添加子視圖以捕獲捏手勢等),但我總是發現這些引入滯後事件,並希望儘可能保持實施清潔/免費。

回答

59

您可以防止用戶縮放通過設置WKWebKit的的UIScrollView的委託,實施viewForZooming(in:),如下:

class MyClass { 
    let webView = WKWebView() 

    init() { 
     super.init() 
     webView.scrollView.delegate = self 
    } 

    deinit() { 
     // Without this, it'll crash when your MyClass instance is deinit'd 
     webView.scrollView.delegate = nil 
    } 
} 

extension MyClass: UIScrollViewDelegate { 
    func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
     return nil 
    } 
} 
+13

不要忘記添加符合'UIScrollViewDelegate',設置'webView.scrollView.delegate = self;'並且將代理指針置於'deinit'中。 – 2015-10-20 14:17:02

+2

這應該被注意爲正確的答案。原生iOS解決方案,而不是嘗試注入JS。 – C6Silver 2015-12-03 19:18:46

+5

我不同意。雖然本地解決方案是理想的,但我認爲這個解決方案與JS解決方案一樣,並且可能更脆弱。雖然WKWebView發佈UIScrollView,但內部使用的是WKScrollView。雖然它是UIScrollView的子類,但它忽略/重寫了許多標準行爲(contentInset)。縮放HTML文檔與縮放UIView非常不同,所以我可以看到這個改變/不再有效的未來。由於JS解決方案使用W3C標準,因此應始終得到支持。 – Kevin 2016-01-28 18:52:39

23

下面的答案不再是iOS的10測試版的工作。

在Safari中改善網站可訪問性,用戶現在可以 捏到變焦,即使一個網站設置用戶可擴展=沒有在 口中。


WKWebView似乎要尊重視口元標記以同樣的方式移動Safari瀏覽器也(如所預期)。所以,我發現在頁面加載完成後,通過javascript將該標籤注入DOM。除非您確切知道將HTML加載到webview中,否則我會厭倦此解決方案,否則我懷疑它會產生意想不到的後果。就我而言,我正在加載HTML字符串,所以我可以將它添加到隨應用程序一起提供的HTML中。

要在任何網頁上做一般:

- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation { 
    NSString *javascript = @"var meta = document.createElement('meta');meta.setAttribute('name', 'viewport');meta.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no');document.getElementsByTagName('head')[0].appendChild(meta);"; 

    [webView evaluateJavaScript:javascript completionHandler:nil]; 
} 

這可能是明智的,看看剛剛完成什麼樣的導航,因爲只有新的頁面都需要執行這個JavaScript。

+6

這仍允許雙擊縮放。需要設置'minimum-scale = 1.0'來避免這種情況。 – fabb 2015-03-01 12:12:43

+1

這個答案有幫助,但我似乎仍然能夠創造可以放大的情況。不知道什麼或如何。 – gravitron 2016-06-03 02:49:09

+0

這是正確的答案 - 不要混淆WKWebView的UIScrollView委託。 – thefaj 2017-09-29 00:38:40

3

雨燕2.0

extension WKWebView { 
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? { 
     return nil 
    } 
} 
+0

請注意,它會對所有WKWebViews執行此操作 – Luke 2017-03-15 05:35:21

+0

如果先將其子類化並將擴展名應用於子類,則不適用。適用於我。 – BaseZen 2017-03-31 21:38:00

1

我沒有足夠的聲望來給答案添加評論,但我想提一提的是,凱文的解決方案(元視口)不再適用於iOS 10 beta。雖然Landschaft的解決方案正在爲我工​​作!

由於JS解決方案使用W3C標準,因此應始終支持它。

啊,凱文,我希望是這些東西是如何工作的。

這裏更多:https://stackoverflow.com/a/37859168/1389714

+1

Welp。所以,我想。更改正確答案,感謝評論。 – Kevin 2016-07-13 15:53:20

0

如果不是重要的,你來處理內部的HTML鏈接(說你要只顯示文本)的最簡單的將關閉用戶交互 webView.userInteractionEnabled = false

+0

這將禁用網址攻絲 – 2017-01-30 12:39:31

+0

因此,我寫了「如果它不是重要的你在HTML內處理鏈接」 – lvp 2017-01-30 12:41:09

+0

這將禁用滾動! OP想禁用捏縮放,但我想他想要一個可用的webview。 – tanzolone 2017-03-06 18:02:20

0

我們需要使用XCode 8中的以下簽名更改代表呼叫:

重寫func viewForZooming(在scrollView中:UIScrollView) - > UIView? { return nil }

-1

我工作的應用程序需要使用Javascript來放大視圖。接受的答案阻止了頁面內部JavaScript的縮放。 我只需要禁用應用程序用戶的捏合手勢。我發現的唯一的解決辦法是禁用Web視圖的手勢在頁面加載後:

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { 
    /* disable pinch gesture recognizer to allow zooming the web view by code but prevent zooming it by the user */ 
    for (UIGestureRecognizer *gr in self.webView.scrollView.gestureRecognizers) { 
     if ([gr isKindOfClass:[UIPinchGestureRecognizer class]]) { 
      gr.enabled = NO; 
     } 
    } 
} 
11

完全斯威夫特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; 
    } 
} 
3

我已經嘗試設置的UIScrollView1isMultipleTouchEnabledUIView屬性minimumZoomScalemaximumZoomScale性質false或從調用viewForZooming(in:)返回但沒有工作。在我的情況下,一些試錯後,在我的情況下工作[測試在iOS 10.3]:

class MyViewController: UIViewController { 
    var webView: WKWebView? 

    override viewDidLoad() { 
     super.viewDidLoad() 

     //... 
     self.webView.scrollView.delegate = self 
     //... 
    } 
} 

extension MyViewController: UIScrollViewDelegate { 
    func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) { 
     scrollView.pinchGestureRecognizer?.isEnabled = false 
    } 
} 
+0

謝謝!這正是我想要的。被接受的答案不適用於我的情況,因爲在委託中返回'nil'後,我的網頁的比例是錯誤的。 – 2017-09-11 06:06:56

+0

完美!使用這個,你可以通過JS改變圖像幀而沒有任何不好的影響。 – guozqzzu 2017-10-13 08:09:58

1

這是Swift3視圖控制器我如何禁用變焦爲一WebView的唯一的應用程序

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; 
    }  

} 
+0

終於!男人很難跟蹤常量的Swift變化(網上幾乎所有其他的事情都有委託func爲「viewForZoomingInScrollView」。感謝此次更新到「viewForZooming」 – 2017-09-15 20:53:29

+0

@thefaj這個解決方案對我來說很好,那就是它 – godblessstrawberry 2017-09-29 08:15:13

0

如果網頁流量是用戶用於只讀目的,即只是用於顯示網頁內容使用

webView.isUserInteractionEnabled = false

由此縮放手勢將無法使用它。

1

你可以使用UIScrollViewDelegate。先使用viewDidLoad()或其他任何適當的方法將委託分配給您的webview:

class LoginViewController: UIViewController, WKUIDelegate, UIScrollViewDelegate { 
    override func viewDidLoad() { 
    webView.scrollView.delegate = self 
    } 

//And add this delegate method in your controller: 

    func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) { 
    scrollView.pinchGestureRecognizer?.isEnabled = false 
    scrollView.panGestureRecognizer.isEnabled = false 
    } 
}