У меня есть небольшое приложение-прототип, разработанное на 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()
, чтобы напрямую создать WKWebView
и назначить его свойству view
ViewController
в качестве корневого представления, а не загружать представление, определенное в раскадровке.
Обратите внимание, что аргумент frame
для WKWebView
может быть прокомментирован или удален, чтобы продемонстрировать различные варианты поведения, лежащие в основе этого вопроса.
Желаемое поведение
Экземпляр WKWebView
должен заполнять окно, соответствующее каждому документу, а начальный размер и положение окон нового документа должны быть такими же, как и для NSWindow
в раскадровке (480x270 при (196, 240)). Размер WKWebView
должен изменяться вместе с окружающим окном.
Наблюдаемое поведение
Без аргумента frame
Без аргумента frame
окно документа не отображается при запуске приложения, хотя меню "Окно" показывает, что был создан документ "Без названия". Окна документов также не отображаются, когда другие документы (Без названия 2 и т. д.) создаются с помощью Файл > Создать.
Однако, если документ отображается в полноэкранном режиме с помощью Просмотр > Войти в полноэкранный режим, WKWebView
и его приветствие отображаются должным образом.
С аргументом frame
С аргументом frame
окна документа, содержащие WKWebView
и его приветствие, отображаются с размером и положением, указанными в CGRect
.
Вопрос
Я не понимаю, почему, когда рамка WKWebView
не указана, вид принудительно подгоняется под размер контейнера (экрана) в полноэкранном режиме, а в оконном режиме вроде бы происходит наоборот: Окно принудительно к (вырожденному?) размеру представления, и поэтому становится невидимым. Я ожидал, что новые представления примут размер окна, определенный в раскадровке.
В моем ViewController
, как мне настроить экземпляры WKWebView
, чтобы заполнить NSWindow
, которые структура документа создает в соответствии с каждым NSDocument
? Или, возможно, мой подход ошибочен, и мне следует настроить начальный размер окна с помощью размера представления в ViewController.loadView()
?