2015-09-28 47 views
3

進行自動配置一個好老的WebView在斯威夫特內部網頁,所有我需要做的就是:如何自動調整WKWebView的內容?

var w:UIWebView 
w.scalesPageToFit=true 

我找不到一個WKWebView等效的方法和網頁出現在我的應用程序太大。我如何自動調整WKWebView的內容?

-I我使用的Xcode 7和斯威夫特

回答

1

這裏是我的解決方案:

extension WKWebView { 
    private struct key { 
     static let scale = unsafeBitCast(Selector("scalesPageToFit"), UnsafePointer<Void>.self) 
    } 
    private var sourceOfUserScript: String { 
     return "(function(){\n" + 
      " var head = document.getElementsByTagName('head')[0];\n" + 
      " var nodes = head.getElementsByTagName('meta');\n" + 
      " var i, meta;\n" + 
      " for (i = 0; i < nodes.length; ++i) {\n" + 
      "  meta = nodes.item(i);\n" + 
      "  if (meta.getAttribute('name') == 'viewport') break;\n" + 
      " }\n" + 
      " if (i == nodes.length) {\n" + 
      "  meta = document.createElement('meta');\n" + 
      "  meta.setAttribute('name', 'viewport');\n" + 
      "  head.appendChild(meta);\n" + 
      " } else {\n" + 
      "  meta.setAttribute('backup', meta.getAttribute('content'));\n" + 
      " }\n" + 
      " meta.setAttribute('content', 'width=device-width, user-scalable=no');\n" + 
     "})();\n" 
    } 
    var scalesPageToFit: Bool { 
     get { 
      return objc_getAssociatedObject(self, key.scale) != nil 
     } 
     set { 
      if newValue { 
       if objc_getAssociatedObject(self, key.scale) != nil { 
        return 
       } 
       let time = WKUserScriptInjectionTime.AtDocumentEnd 
       let script = WKUserScript(source: sourceOfUserScript, injectionTime: time, forMainFrameOnly: true) 
       configuration.userContentController.addUserScript(script) 
       objc_setAssociatedObject(self, key.scale, script, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
       if URL != nil { 
        evaluateJavaScript(sourceOfUserScript, completionHandler: nil) 
       } 
      } else if let script = objc_getAssociatedObject(self, key.scale) as? WKUserScript { 
       objc_setAssociatedObject(self, key.scale, nil, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
       configuration.userContentController.removeUserScript(script) 
       if URL != nil { 
        let source = "(function(){\n" + 
         " var head = document.getElementsByTagName('head')[0];\n" + 
         " var nodes = head.getElementsByTagName('meta');\n" + 
         " for (var i = 0; i < nodes.length; ++i) {\n" + 
         "  var meta = nodes.item(i);\n" + 
         "  if (meta.getAttribute('name') == 'viewport' && meta.hasAttribute('backup')) {\n" + 
         "   meta.setAttribute('content', meta.getAttribute('backup'));\n" + 
         "   meta.removeAttribute('backup');\n" + 
         "  }\n" + 
         " }\n" + 
        "})();" 
        evaluateJavaScript(source, completionHandler: nil) 
       } 
      } 
     } 
    } 
} 
extension WKUserContentController { 
    public func removeUserScript(script: WKUserScript) { 
     let scripts = userScripts 
     removeAllUserScripts() 
     scripts.forEach { 
      if $0 != script { self.addUserScript($0) } 
     } 
    } 
} 
0

這個工作對我來說,如果有一個更簡單或更清潔的方式,讓我們知道。在這個例子中,每當設備的屏幕方向發生變化時,我調整WKWebview的大小,將代碼放在ViewController中。在我的情況下,我加載的網站可能已經在一個瀏覽器中自動自動調整大小,並且使用此代碼,它也將在WKWebView中調整大小:

onViewDidLoad{ 

     // other initialization code here... 

     screenWidth=UIScreen.mainScreen().bounds.width 
     screenHeight=UIScreen.mainScreen().bounds.height 
    } 

     var screenWidth:CGFloat=0 
     var screenHeight:CGFloat=0 
     func resizeAccordingToOrientation(){ 
      if UIDevice.currentDevice().orientation.isLandscape.boolValue { 
       var frame:CGRect = webView!.frame; 
       frame.size = CGSizeMake(screenHeight, screenWidth-getNavBarHeight())//w,h !!! 
       frame.origin.x=0 
       frame.origin.y=getNavBarHeight() 
       webView!.frame = frame; 
       //print("Origin x: "+(webView?.frame.origin.x.description)!+" , "+(webView?.frame.origin.y.description)!) 
      } 
      else{ 
       var frame:CGRect = webView!.frame; 
       frame.size = CGSizeMake(screenWidth,screenHeight-getNavBarHeight()-self.navigationController!.navigationBar.frame.origin.y) 
       frame.origin.x=0 
       frame.origin.y=getNavBarHeight()+self.navigationController!.navigationBar.frame.origin.y 
       webView!.frame = frame; 
       //print("Origin x: "+(webView?.frame.origin.x.description)!+" , "+(webView?.frame.origin.y.description)!) 
      } 
     } 


    func getNavBarHeight() -> CGFloat{ 
      return self.navigationController!.navigationBar.frame.size.height 
     } 
相關問題