Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios WKWebView在方向更改后显示内容错误_Ios_Swift_Wkwebview - Fatal编程技术网

Ios WKWebView在方向更改后显示内容错误

Ios WKWebView在方向更改后显示内容错误,ios,swift,wkwebview,Ios,Swift,Wkwebview,我对iOS开发相当陌生,我正在使用WKWebView来显示一个使用Vimeo播放器播放视频的页面。当应用程序启动时,无论当前处于哪个方向,它都会正确显示视图。但是,一旦我更改方向,视图将看起来放大或在视频下方有空白 令人恼火的是它并不一致。有时视图显示正确,有时不正确。如果我在使用该应用程序时尝试放大或缩小视图,或者尝试滚动,它通常会自动更正,但即使这样似乎也不是100%可靠 一些截图(在iPad 2上测试): 横向方向(正确): 纵向方向(正确): 横向方向(不正确): 纵向(不正确):

我对iOS开发相当陌生,我正在使用
WKWebView
来显示一个使用Vimeo播放器播放视频的页面。当应用程序启动时,无论当前处于哪个方向,它都会正确显示视图。但是,一旦我更改方向,视图将看起来放大或在视频下方有空白

令人恼火的是它并不一致。有时视图显示正确,有时不正确。如果我在使用该应用程序时尝试放大或缩小视图,或者尝试滚动,它通常会自动更正,但即使这样似乎也不是100%可靠

一些截图(在iPad 2上测试):

横向方向(正确):

纵向方向(正确):

横向方向(不正确):

纵向(不正确):

以及用于生成此结果的代码:

import Foundation
import UIKit
import WebKit

class VideoViewController : UIViewController, WKScriptMessageHandler {

@IBOutlet var containerView : UIView! = nil
var webView: WKWebView?

override func loadView() {
    super.loadView()
    self.webView = WKWebView()
    let contentController = WKUserContentController();
    let scaleToFit = WKUserScript(source: "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width, initial-scale=1.0'); document.getElementsByTagName('head')[0].appendChild(meta);", injectionTime: WKUserScriptInjectionTime.AtDocumentStart, forMainFrameOnly: true)
    contentController.addUserScript(scaleToFit)
    contentController.addScriptMessageHandler(self, name: "callbackHandler")
    self.view = webView!
}

override func viewDidLoad() {
    super.viewDidLoad()
    refreshUI()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func refreshUI() {
    let url = NSURL(string: "https://photofactsacademy.nl/api/vp.asp?id=152839850")
    let requestObj = NSURLRequest(URL: url!)
    webView!.loadRequest(requestObj)
}

func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
    if(message.name == "callbackHandler") {
        print("JavaScript is sending a message \(message.body)")
    }
}
}
我在SO中查找了WKWebView和方向更改,但没有找到任何对我有帮助的内容


非常感谢您的帮助。

我通过注入javascript重新加载调用解决了这个问题,如下所示:

斯威夫特:

 func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animateAlongsideTransition(nil, completion: {
     //Reset Frame of Webview
     webView.evaluateJavaScript("location.reload();", completionHandler: nil)
}
目标C:

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    //Reset Frame of Webview
    [_webView evaluateJavaScript:@"location.reload();" completionHandler:^(id _Nullable obj, NSError * _Nullable error) {
        NSLog(@"error:%@", error);
    }];
}
-(void)视图将转换大小:(CGSize)带有转换协调器的大小:(id)协调器{
//重置Webview的框架
[\u webView evaluateJavaScript:@“location.reload();”completionHandler:^(id\u可为null的对象,n错误*\u可为null的错误){
NSLog(@“错误:%@”,错误);
}];
}
你能试试这个吗

wkWebView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

经过几个小时的挣扎,这对我来说很有效:

<header><meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, shrink-to-fit=no'></header><body style='margin: 0px; padding: 0px; width:100%; height:100%;'>...
。。。

将主体和视频元素的宽度和高度都设置为100%,并禁用用户通过标题标签进行缩放。

您无需重新加载整个网页。您只需要重新加载它的输入视图。确保已正确设置了“web视图”的约束,然后在更改方向时添加以下代码

   // Reload inputs so that webview can adjust its content according to orientation
     [self.webView reloadInputViews];

可能在设备旋转时设置帧:override func didRotateFromInterfaceOrientation(fromInterfaceOrientation:UIInterfaceOrientation){//为webview设置帧???}不幸的是,这不起作用。我得到了同样的结果,我也有同样的问题。你的解决方案确实有效。尽管在JavaScript调用被调用和执行之间有一点延迟。我想我们必须接受它。你找到解决方案了吗?更新为包含两者,希望没问题。这会重新加载整个页面…如果你导航到更深的链接…调用此链接将带你到基本链接…我将此答案与下面Abdul Yasin的答案结合起来,效果非常好。基本上调用
webView.reloadInputViews
inside
viewwilltransitionosize
。除了objective-c,我也遇到了这个问题。添加self.webView.translatesAutoresizingMaskIntoConstraints=否;self.webView.autoresizingMask=(uiviewsautoresizingflexiblewidth | uiviewsautoresizingflexiblewhight);“在改变方向时”,怎么做?@DanielSpringer:有一些方法,叫做改变方向。例如,
didRotateFromInterfaceOrientation()
。但对我来说,这对我的处境毫无帮助……那么,在改变方向的同时,你是如何运行代码的呢?请参阅下面的@andre评论。本质上,调用webView.reloadInputViews inside Views将转变为Sizen这对于任何网站都不是一个好主意。。。只有当你有一个你控制的网站时,它才有效。好吧,我还没有测试过这个,但是-你可以在你的webview中输入一个自定义html,同时在正文中有一个iframe,它可以加载任何网站。也许问题也可以通过这种方式解决。这将是一个解决办法,但最好的办法是让网站自己选择它的设置。