【问题标题】: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 我建议它应该在应用程序内
  • 在应用内是的
  • 视图控制器不是界面元素,那么“点击外部视图控制器”是什么意思呢?

标签: swift macos cocoa gesture


【解决方案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...
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 2013-10-14
    • 2018-12-20
    • 1970-01-01
    • 2011-09-20
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多