【发布时间】:2019-10-23 08:26:49
【问题描述】:
这就是如何使用附属视图控制器将 SwiftUI 插入到NSToolbar:
import SwiftUI
import PlaygroundSupport
var hostingView = NSHostingView(rootView:
ZStack {
Color.clear
HStack {
Text("Hey")
Text("SwiftUI")
}
}
.padding()
.edgesIgnoringSafeArea(.all)
)
hostingView.frame.size = hostingView.fittingSize
let titlebarAccessory = NSTitlebarAccessoryViewController()
titlebarAccessory.view = hostingView
titlebarAccessory.layoutAttribute = .trailing
let mask: NSWindow.StyleMask = [.titled, .closable, .miniaturizable, .resizable]
let window = NSWindow(
contentRect: .init(x: 0, y: 0, width: 480, height: 300),
styleMask: mask, backing: .buffered, defer: false)
window.center()
window.contentView = NSHostingView(rootView: Color(.windowBackgroundColor))
window.toolbar = .init()
window.titleVisibility = .hidden
window.addTitlebarAccessoryViewController(titlebarAccessory)
PlaygroundPage.current.liveView = window.contentView?.superview
上面的代码确实有效:
如果我们插入一个按钮:
HStack {
Text("Hey")
Button(action: {}) {
Text("SwiftUI")
}
}
它不会按预期工作:
有什么建议吗?
P. S. 这是一个可行的解决方案:
HStack {
Text("Hey")
.offset(x: 0, y: -1)
Button(action: {}) {
Text("SwiftUI")
.offset(x: 0, y: -7)
}
}
.font(.caption)
【问题讨论】:
-
绝对不是一个好的答案,但您可以在按钮中的文本上使用
.padding(EdgeInsets(top: -7, leading: 0, bottom: 0, trailing: 0))。不过肯定有问题。 -
@LucasDerraugh 实际上这是一个很好的答案。可以提交吗?
-
@Vadim 我很好奇你为什么使用
ZStack。 -
@BijoyThangaraj 在这种特殊情况下感觉不像 H 或 V 那么奇怪 ????
-
我注意到,当最终用户使窗口全屏显示时,显然不会发生此错误,从而使所有解决方法(尽管它们很丑)都无法使用... :(
标签: cocoa swiftui nswindow appkit nstoolbar