SwiftUI macOS中如何在按钮或图像上实现弹出窗口?

6

enter image description here

我希望我能像图片中所示一样做到这件事。

我正在尝试使用这段代码,但我不太明白如何修复它。

我希望我能在 Button 或者 ImageMac 上使用它,它应该是一张图片。

有人可以帮我吗?

代码:

func showLittlePopoverWithMessage(sender: NSView, message: String) {
        let controller = NSViewController()
        controller.view = NSView(frame: CGRect(x: CGFloat(100), y: CGFloat(50), width: CGFloat(100), height: CGFloat(50)))

        let popover = NSPopover()
        popover.contentViewController = controller
        popover.contentSize = controller.view.frame.size

        popover.behavior = .transient
        popover.animates = true

        let invisibleWindow = NSWindow(contentRect: NSMakeRect(0, 0, 20, 5), styleMask: .borderless, backing: .buffered, defer: false)
        invisibleWindow.backgroundColor = .red
        invisibleWindow.alphaValue = 0

        //controller.view.addSubview(sender)
        popover.show(relativeTo: sender.bounds, of: sender as! NSView, preferredEdge: .maxY)
    }

#if os(macOS)
struct ImageMac: View {
    let symbol: String
    init(systemName: String) {
        self.symbol = [
            "star":         "☆",
            "star.fill":    "★",
            "heart":        "",
            "heart.fill":   "",
            "video":        "",
            "lock.fill":    "",
            "lock.open.fill":    "",
            "checkmark.seal.fill": ""
            ][systemName] ?? "?"
    }
    var body: some View { Text(symbol) }
}
#endif

ImageMac(systemName: "checkmark.seal.fill").foregroundColor(.blue)

Button(action: {}) {
   Text("Button")
}
1个回答

15

这是一种可能的方法演示。使用Xcode 11.7 / macOS 10.15.6进行准备和测试。

demo

struct ContentView: View {
    @State var isPopover = false
    var body: some View {
        VStack {
            Button(action: { self.isPopover.toggle() }) {
                Image(nsImage: NSImage(named: NSImage.infoName) ?? NSImage())
            }.popover(isPresented: self.$isPopover, arrowEdge: .bottom) {
                     PopoverView()
            }.buttonStyle(PlainButtonStyle())
        }.frame(width: 800, height: 600)
    }
}

struct PopoverView: View {
    var body: some View {
        VStack {
            Text("Some text here ").padding()
            Button("Resume") {
            }
        }.padding()
    }
}

虽然答案确实显示了弹出窗口,但“恢复”按钮并没有将其关闭。解决此问题的一种方法是将isPopover状态变量作为@Binding传递到PopoverView中。在那里可以切换isPopover以关闭视图。 - gekart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接