swift 检查用户是否在视图控制器外单击

bjg7j2ky  于 2023-03-28  发布在  Swift
关注(0)|答案(3)|浏览(132)

我正在使用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")
}
liwlm1x9

liwlm1x91#

NSEvent有一个方法叫做...
+ (id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent * _Nullable (^)(NSEvent *))block;
...在调度事件之前捕获事件。
请求监视鼠标向上或向下事件,并使用该块比较坐标与视图边界。
编辑:
不过在斯威夫特这叫...
class func addLocalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> NSEvent?) -> Any?

zpjtge22

zpjtge222#

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
      }
 }
ru9i0ody

ru9i0ody3#

I would use touches已经结束left:然后使用事件获取locationInWindow。如果位置福尔斯了您的视图范围,则将其关闭。iOS的类似问题可以在这里看到。
IOS - How to hide a view by touching anywhere outside of it
我总是更喜欢touchedEnded,因为如果用户不小心点击了外部,他们仍然可以拖动到视图中取消解雇。

相关问题