Как скрыть верхнюю панель (с кнопками) с помощью 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)

Другие вопросы по тегам