可编辑的 NSTextField 位于非 .titled NSPanel 中

问题描述 投票:0回答:2

我正在为react-native-macos 搭建一座桥梁。我需要 NSPanel 具有与 Spotlight 相同的行为。

我在里面以编程方式创建了 NSPanel 和 NSTextField。一切都按预期工作,但如果我将 NSPanel 更改为非 .titled - 文本字段将被禁用。

作品:

panel = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 400, height: 40), styleMask: [
    .borderless,
    .nonactivatingPanel,
    .titled,  < ------- HERE
    .resizable,
  ], backing: .buffered, defer: true)

searchField = NSTextField()
searchField.delegate = self
searchField.isBezeled = false
searchField.font = NSFont.systemFont(ofSize: 20, weight: .light
searchField.drawsBackground = false
searchField.placeholderString = "Query here..."
searchField.setFrameSize(NSMakeSize(400, 40)

不起作用:

panel = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 400, height: 40), styleMask: [
    .borderless,
    .nonactivatingPanel,
    .resizable,
  ], backing: .buffered, defer: true)

searchField = NSTextField()
searchField.delegate = self
searchField.isBezeled = false
searchField.font = NSFont.systemFont(ofSize: 20, weight: .light
searchField.drawsBackground = false
searchField.placeholderString = "Query here..."
searchField.setFrameSize(NSMakeSize(400, 40)

如何制作带有隐藏标题栏和内部可编辑 NSTextField 的 NSPanel?

objective-c swift macos nswindow nspanel
2个回答
0
投票

我相信

.borderless
.titled
是相互排斥的。换句话说,当您在顶部代码中指定
.borderless
时,
.titled
会覆盖它,您最终会得到一个正常处理事件的“普通窗口”。在第二个代码中,
.borderless
实际上进行了注册,最终您得到了一个无边框窗口子类,它以完全不同的方式处理事件。但所有这些都不是重点。

假设您可以要求高于macOS 10.10,则可以使用以下代码:

panel = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 400, height: 40), styleMask: [
    .titled,
    .fullSizeContentView,
    ], backing: .buffered, defer: true)
panel.titleVisibility = .hidden
panel.titlebarAppearsTransparent = true
panel.makeFirstResponder(searchField)
panel.makeKeyAndOrderFront(nil)

这将获得一个全尺寸的标题面板,可以正常处理事件(它允许其视图成为关键)。然后在显示面板之前,隐藏标题栏并使其透明。请注意,要使标题栏完全消失,您不需要使用任何

.resizable
.closable
.miniaturizable
选项。


0
投票

只需将其添加到我的类中,该类继承自 NSPanel 并代表浮动面板,这有助于使文本字段具有响应能力。

override var canBecomeKey: Bool {
    return true
}

override var canBecomeMain: Bool {
    return true
}

在这段代码中找到:https://gist.github.com/jordibruin/8ae7b79a1c0ce2c355139f29990d5702

© www.soinside.com 2019 - 2024. All rights reserved.