2016-01-27 3 views
4

Я довольно новичок в разработке iOS, и я использую WKWebView для отображения страницы, воспроизводящей видео с помощью Vimeo Player. Когда приложение запускается, оно отображает представление правильно, независимо от того, в какой ориентации он находится сейчас. Однако, как только я изменил ориентацию, представление будет либо увеличено, либо будет иметь пробелы ниже видео.WKWebView отображает содержимое неправильно после изменения ориентации

Досадная вещь об этом заключается в том, что она несовместима. Иногда представление отображается правильно, иногда это не так. Если я попытаюсь увеличить или уменьшить вид или попытаться прокручивать при использовании приложения, он обычно исправляет себя, но даже это не кажется на 100% надежным.

Некоторые скриншоты (проверено на IPAD 2):

альбомной ориентации (правильный): Landscape orientation (correct)

Портрет ориентации (правильный): Portrait orientation (correct)

альбомной ориентации (неверно): Landscape orientation (incorrect)

Портретная ориентация (неверно): Portrait orientation (incorrect)

И код, используемый для получения этого результата:

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 и изменений ориентации и не нашел ничего, что помогло мне.

Ваша помощь приветствуется.

+0

Возможно установить рамки на ро : override func didRotateFromInterfaceOrientation (fromInterfaceOrientation: UIInterfaceOrientation) { // установить кадры для веб-просмотра ??? } – valosip

+0

К сожалению, это не сработало. Я получаю те же результаты. – Ionicawa

+0

У меня такая же проблема. Ваше решение действительно работает. Хотя есть небольшая задержка между вызовом JavaScript, вызываемым и исполняемым. Полагаю, нам придется жить с этим. – Isuru

ответ

2

Я был в состоянии решить эту проблему путем введения яваскрипта перезагрузки вызов вроде этого:

Swift:

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

Objective 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); 
    }]; 
} 
+0

Обновлено, чтобы включить оба, надеюсь, что все в порядке. –

+0

Это перезагружает всю страницу ... скажем, если вы перешли на более глубокую ссылку ... называя это, вы получите базовую ссылку .... – anoop4real

5

Вы можете попробовать этот

wkWebView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
+1

Это должен быть принятый ответ – quemeful

+0

Я тоже сталкивался с этой проблемой, но для цели-с. Добавить self.webView.translatesAutoresizingMaskIntoConstraints = NO; self.webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); –

Смежные вопросы