检查用户是否点击了外部视图控制器

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

我正在为 macOS 使用 swift 4,如果我在这个视图控制器之外单击,我想关闭一个视图控制器。

有了这段代码,我可以检查用户是否点击了视图控制器。但是如果用户在视图控制器外部单击,我该如何检查?

override func viewDidAppear() {
   let gesture = NSClickGestureRecognizer(target: self, action: #selector(clicked))
   gesture.buttonMask = 0x1 // left mouse
   gesture.numberOfClicksRequired = 1
   self.view.addGestureRecognizer(gesture)
}


@objc func clicked() {
   print("Hello world")
}
swift macos cocoa gesture
3个回答
2
投票

NSEvent
有一个方法叫做...

+ (id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent * _Nullable (^)(NSEvent *))block;

...在派发事件之前捕获事件。

要求监控鼠标弹起或鼠标按下事件,并使用该块将坐标与视图的边界进行比较。

编辑:

除了,在 Swift 中,它被称为...

class func addLocalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> NSEvent?) -> Any?


0
投票

完整的swift版本。

添加变量监视器

var monitor: Any?

在 viewDidLoad 中添加

   monitor = NSEvent.addLocalMonitorForEvents(matching: NSEvent.EventTypeMask.leftMouseDown) { (event) -> NSEvent? in
           let rect = self.view.convert(self.view.frame, to: event.window?.contentView)
           if !rect.contains(event.locationInWindow) {
                print("OUTSIDE")
           }
           return event
      }

取消初始化

 deinit {
      if monitor != nil {
           NSEvent.removeMonitor(monitor!)
           monitor = nil
      }
 }

-2
投票

我会使用 touchesEnded:然后使用事件来获取 locationInWindow。如果该位置超出您的视野范围,则将其关闭。可以在此处看到针对 iOS 的类似问题。

IOS - 如何通过触摸视图之外的任何地方来隐藏视图

我总是更喜欢 touchedEnded,因为如果用户不小心在外面点击,他们仍然可以拖动到视图以取消解雇。

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