检查用户是不是点击了外部视图控制器
Posted
技术标签:
【中文标题】检查用户是不是点击了外部视图控制器【英文标题】:check if user clicked outside view controller检查用户是否点击了外部视图控制器 【发布时间】:2017-10-04 18:31:38 【问题描述】:我正在为 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")
【问题讨论】:
您是指在您的应用窗口内或完全在应用外的不同视图? 一个将显示为工作表的视图控制器。如果我在此工作表视图控制器之外单击,我想关闭此工作表视图控制器 @PhillipMills 我建议它应该在应用程序内 在应用内是的 视图控制器不是界面元素,那么“点击外部视图控制器”是什么意思呢? 【参考方案1】:NSEvent
有一个方法叫...
+ (id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent * _Nullable (^)(NSEvent *))block;
...在分派事件之前捕获事件。
要求监视鼠标向上或鼠标向下事件,并使用块将坐标与视图的边界进行比较。
编辑:
除了,在 Swift 中,它被称为...
class func addLocalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> NSEvent?) -> Any?
【讨论】:
【参考方案2】:我会使用 touchesEnded: 然后使用事件来获取 locationInWindow。如果该位置超出您的视野范围,则将其关闭。可以在此处查看 ios 的类似问题。
IOS - How to hide a view by touching anywhere outside of it
我总是更喜欢touchedEnded,因为如果用户不小心点击了外部,他们仍然可以拖动到视图以取消关闭。
【讨论】:
需要 OSX 解决方案 这就是为什么我说使用 touchesBegan/touchesEnded 并检查为 locationInWindow 变量传入的 NSEvent...以上是关于检查用户是不是点击了外部视图控制器的主要内容,如果未能解决你的问题,请参考以下文章