У меня есть небольшое прототипное приложение, разработанное в Swift с XCode 7.2. Приложение было создано как приложение Cocoa на основе документов с раскадрой. Таким образом, проект содержит AppDelegate.swift
, Document.swift
и Main.storyboard
, все из которых не изменены из того, что генерируется XCode, и ViewController.swift
, который содержит это:
import Cocoa
import WebKit
class ViewController: NSViewController {
var webView: WKWebView {
return view as! WKWebView
}
override func loadView() {
view = WKWebView(/*frame: CGRect(x: 0, y: 0, width: 200, height: 200)*/)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
webView.loadHTMLString("<html><body><p>Hello, World!</p></body></html>", baseURL: nil)
}
}
Я переопределил loadView()
, чтобы непосредственно создать a WKWebView
и назначить ему свойство view
ViewController
в качестве корневого представления, а не загружать представление, определенное в раскадровке.
Обратите внимание, что аргумент frame
для WKWebView
может быть прокомментирован или отсутствовать, чтобы продемонстрировать различные типы поведения, которые лежат в основе этого вопроса.
Желаемое поведение
A WKWebView
экземпляр должен заполнить окно, соответствующее каждому документу, а начальный размер и положение новых окон документа должны быть такими, которые определены для NSWindow
в раскадровке (480x270 на (196, 240)). WKWebView
должен изменить размер с закрывающим окном.
Наблюдаемое поведение
Без аргумента frame
Без аргумента frame
при запуске приложения не отображается окно документа, хотя в меню "Окно" отображается, что был создан документ "Без названия". Также не отображаются окна документа, когда дополнительные документы (Untitled 2 и т.д.) Создаются с помощью файлa > Создать.
Однако, если документ отображается в полноэкранном режиме с помощью "Просмотр" > "Ввод полного экрана", WKWebView
и его приветствие отображаются, как ожидалось.
С аргументом frame
С аргументом frame
окна документа, содержащие WKWebView
и его приветствие, отображаются в размере и позиции, указанной в CGRect
.
Вопрос
Я не понимаю, почему, когда кадр WKWebView
не указан, представление принудительно добавляется к размеру контейнера (экрана) в полноэкранном режиме, но в оконном режиме противоположное, по-видимому, происходит: Окно вынуждено (выродить?) Размер представления, и поэтому становится невидимым. Я ожидал, что новые взгляды примут размер окна, как определено в раскадровке.
В моем ViewController
, как мне настроить экземпляры WKWebView
для заполнения NSWindow
рамки документа, соответствующие каждому NSDocument
? Или, возможно, мой подход неверен, и я должен включить настройку размера начального окна с помощью размера представления в ViewController.loadView()
?