進行自動配置一個好老的WebView在斯威夫特內部網頁,所有我需要做的就是:如何自動調整WKWebView的內容?
var w:UIWebView
w.scalesPageToFit=true
我找不到一個WKWebView等效的方法和網頁出現在我的應用程序太大。我如何自動調整WKWebView的內容?
-I我使用的Xcode 7和斯威夫特
進行自動配置一個好老的WebView在斯威夫特內部網頁,所有我需要做的就是:如何自動調整WKWebView的內容?
var w:UIWebView
w.scalesPageToFit=true
我找不到一個WKWebView等效的方法和網頁出現在我的應用程序太大。我如何自動調整WKWebView的內容?
-I我使用的Xcode 7和斯威夫特
這裏是我的解決方案:
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) }
}
}
}
這個工作對我來說,如果有一個更簡單或更清潔的方式,讓我們知道。在這個例子中,每當設備的屏幕方向發生變化時,我調整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
}