2017-10-04 93 views
-1

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

你的意思是你的应用程序的窗口(S)内有不同的看法,或完全在应用之外? –

+0

一个视图控制器,它将显示为一张图纸。如果我点击这个图表视图控制器的外部,我想关闭这个图表视图控制器 – Ghost108

+0

@PhillipMills我建议它应该在应用程序内 –

回答

-1

我会用touchesEnded:然后使用事件抢locationInWindow。如果该位置超出了您的视野范围,请将其解除。 iOS的类似问题可以在这里看到。

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

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

+2

需要OSX解决方案 – Ghost108

+0

这就是为什么我说使用touchesBegan/touchesEnded并检查传入的locationInWindow变量的NSEvent ... – MurderDev

1

NSEvent有一个名为方法...

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

...捕获的事件,他们被派遣之前。

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

编辑:

除了在斯威夫特,这就是所谓的...

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

相关问题