我正在为 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")
}
NSEvent
有一个方法叫做...
+ (id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent * _Nullable (^)(NSEvent *))block;
...在派发事件之前捕获事件。
要求监控鼠标弹起或鼠标按下事件,并使用该块将坐标与视图的边界进行比较。
编辑:
除了,在 Swift 中,它被称为...
class func addLocalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> NSEvent?) -> Any?
完整的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
}
}
我会使用 touchesEnded:然后使用事件来获取 locationInWindow。如果该位置超出您的视野范围,则将其关闭。可以在此处看到针对 iOS 的类似问题。
我总是更喜欢 touchedEnded,因为如果用户不小心在外面点击,他们仍然可以拖动到视图以取消解雇。