我正在使用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")
}
3条答案
按热度按时间liwlm1x91#
NSEvent
有一个方法叫做...+ (id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent * _Nullable (^)(NSEvent *))block;
...在调度事件之前捕获事件。
请求监视鼠标向上或向下事件,并使用该块比较坐标与视图边界。
编辑:
不过在斯威夫特这叫...
class func addLocalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> NSEvent?) -> Any?
zpjtge222#
Swift完整版
添加变量监视器
添加到viewDidLoad
去初始化
ru9i0ody3#
I would use touches已经结束left:然后使用事件获取locationInWindow。如果位置福尔斯了您的视图范围,则将其关闭。iOS的类似问题可以在这里看到。
IOS - How to hide a view by touching anywhere outside of it
我总是更喜欢touchedEnded,因为如果用户不小心点击了外部,他们仍然可以拖动到视图中取消解雇。