检查用户是否点击了外部视图控制器
问题描述:
我正在使用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")
}
答
我会用touchesEnded:然后使用事件抢locationInWindow。如果该位置超出了您的视野范围,请将其解除。 iOS的类似问题可以在这里看到。
IOS - How to hide a view by touching anywhere outside of it
我总是喜欢touchedEnded因为如果用户不小心点击之外,他们还可以拖动到视图取消解雇。
答
NSEvent
有一个名为方法...
+ (id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent * _Nullable (^)(NSEvent *))block;
...捕获的事件,他们被派遣之前。
要求监视鼠标或向下鼠标事件,并使用该块将坐标与视图的边界进行比较。
编辑:
除了在斯威夫特,这就是所谓的...
class func addLocalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> NSEvent?) -> Any?
你的意思是你的应用程序的窗口(S)内有不同的看法,或完全在应用之外? –
一个视图控制器,它将显示为一张图纸。如果我点击这个图表视图控制器的外部,我想关闭这个图表视图控制器 – Ghost108
@PhillipMills我建议它应该在应用程序内 –