Как скрыть верхнюю панель (с кнопками) с помощью Swift и MacOS?
Я пытаюсь удалить заголовок и верхние кнопки из окна и в основном отображать только содержимое. Я пробовал разные вещи без успеха без какой-либо видимой причины, почему это не работает. Смотрите функцию setVisibility для опций, которые я пробовал
AppDelagate.swift
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet weak var window: NSWindow!
func setVisibility(){
self.window?.titlebarAppearsTransparent = true;
self.window?.styleMask = .borderless
self.window?.titleVisibility = .hidden
self.window?.styleMask.insert(.fullSizeContentView)
/*
self.window?.standardWindowButton(.zoomButton)!.isHidden = true
self.window?.standardWindowButton(.closeButton)!.isHidden = true
*/
self.window?.level = .floating
self.window?.center()
self.window?.collectionBehavior = .canJoinAllSpaces
//self.window?.collectionBehavior = .moveToActiveSpace
}
func applicationDidFinishLaunching(_ aNotification: Notification) {
setVisibility()
NSApp.activate(ignoringOtherApps: true)
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
func applicationDidBecomeActive(_ aNotification: Notification) {
setVisibility()
NSApp.activate(ignoringOtherApps: true)
}
func applicationWillResignActive(_ aNotification: Notification) {
setVisibility()
NSApp.activate(ignoringOtherApps: true)
}
func applicationWillEnterForeground(_ aNotification: Notification) {
setVisibility()
NSApp.activate(ignoringOtherApps: true)
}
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
NSApp.terminate(self)
return true
}
}
ViewController.swift Я просто встраиваю представление webkit. Ничего фантастического.
import Cocoa
import WebKit
import os
class ViewController: NSViewController, WKUIDelegate, WKNavigationDelegate {
@IBOutlet weak var window: NSWindow!
let webView = WKWebView()
override func viewDidLoad() {
super.viewDidLoad()
self.webView.uiDelegate = self
self.webView.navigationDelegate = self
webView.frame = CGRect(x: 0, y: 0, width: 1200, height: 600)
view.addSubview(webView)
let url = URL(string: "http://localhost:8080/?x=y")
//let url = URL(string: "https://apple.com")
let request = URLRequest(url: url!)
webView.load(request)
}
public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void)
{
if navigationAction.request.url?.path == "/close" || navigationAction.request.url?.path == "/close/"{
exit(0);
}
decisionHandler(.allow)
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
1 ответ
То, что вы хотите, это окно с маской стиля NSWindowStyleMaskBorderless
, Проблема в том, что это должно быть установлено при инициализации окна. Вот почему ваша линияself.window?.styleMask = .borderless
не имеет никакого эффекта
Поскольку вы создаете свое окно с помощью Interface Builder, вы должны открыть соответствующийxib
файл (наверноеMainMenu.xib
), выберите окно и отмените выбор Title Bar
в инспекторе Атрибутов:
Я знаю. Это смущает. Но, по крайней мере, Apple упоминает об этом в документации:
Обратите внимание, что вы можете установить маску стиля окна или панели в NSWindowStyleMaskBorderless в Интерфейсном Разработчике, отменив выбор строки заголовка в разделе "Внешний вид" инспектора атрибутов.
Если вы хотите узнать больше о различных стиляхNSWindow
оформить заказ NSWindowStyles от Luka Kerr. Это отличная ссылка.
Обновление: В упомянутой ссылке я нашел другой способ удалить строку заголовка, которая может работать для вас:
window?.styleMask.remove(.titled)