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

时间:2017-10-04 18:31:39

标签: swift macos cocoa gesture

我正在使用swift 4 for macOS,如果我在这个视图控制器外面点击,我想解雇一个视图控制器。

使用此代码,我可以检查用户是否已点击进入视图控制器。但是,如果用户在视图控制器外部单击,我该如何检查?

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")
}

2 个答案:

答案 0 :(得分:2)

NSEvent有一个名为...的方法

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

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

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

编辑:

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

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

答案 1 :(得分:-1)

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

IOS - How to hide a view by touching anywhere outside of it

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