【问题标题】:Swift: how to apply "acceptsFirstMouse" for app build with SwiftUI?Swift:如何为使用 SwiftUI 的应用程序构建应用“acceptsFirstMouse”?
【发布时间】:2019-12-01 21:22:55
【问题描述】:

假设我有一个适用于 MacOS (Catalina) 的应用程序。

此应用未隐藏。但是另一个应用程序被激活(最前面/最上面)

我想点击按钮/任何其他视图(我使用的是 swiftUI,所以一切都是一个视图),以防点击我的应用程序。

我该怎么做?


UPD:如何应用“acceptsFirstMouse”来使用 SwiftUI 构建应用程序?

【问题讨论】:

  • 你不能,只是
  • @matt 在这种情况下是不可能的,“ubar”不能存在,但它存在。与任何其他“外部”而非内置坞站替代品一样。而这样的应用程序有这样的行为。所以....你错了。这是可能的,但你只是不知道怎么做。
  • 让 Andrew 冷静一下,matt 是一位专家,他撰写了有关 iOS 编程和 Swift 语言的最佳书籍。您的问题模棱两可,您应该专门用 macOS 标记它。
  • 所以现在它只是 stackoverflow.com/questions/128015/… 和许多其他人的副本。
  • 由于SwiftUI标签,它不重复。 SO和任何其他资源上没有关于swiftUI的此类信息。我已经检查过了。

标签: swift macos swiftui macos-catalina


【解决方案1】:

好吧,目前 SwiftUI API 中还没有这样的工具,但是......它不是一个沙漠中的独立工具,Apple 并没有说它是 Cocoa 的替代品,而且他们向我们展示了如何集成它们和两者兼得……

所以,这是可能的方法...

import SwiftUI
import Cocoa

// Just mouse accepter
class MyViewView : NSView {
    override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
        return true
    }
}

// Representable wrapper (bridge to SwiftUI)
struct AcceptingFirstMouse : NSViewRepresentable {
    func makeNSView(context: NSViewRepresentableContext<AcceptingFirstMouse>) -> MyViewView {
        return MyViewView()
    }

    func updateNSView(_ nsView: MyViewView, context: NSViewRepresentableContext<AcceptingFirstMouse>) {
        nsView.setNeedsDisplay(nsView.bounds)
    }

    typealias NSViewType = MyViewView
}

// Usage (somewhere in your SwiftUI view stack)
...
      Text("Click me")
        .padding(20)
        .background(Color.yellow)
        .overlay(AcceptingFirstMouse()) // must be on top (no confuse, it is transparent)
        .onTapGesture {
            print("Label tapped")
        }
...

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多