【问题标题】:NSClickGestureRecognizer.location(in:) and hitTest()NSClickGestureRecognizer.location(in:) 和 hitTest()
【发布时间】:2018-12-13 08:01:23
【问题描述】:

我有以下看法:

它有一个基于NSVisualEffectView 的自定义类,并包含一个图像视图、一个标签(NSTextField)和一个弹出按钮。自定义视图的isFlipped 始终为false

自定义视图还包含一个使用委托的NSClickGestureRecognizer。委托只实现一种方法:

func gestureRecognizerShouldBegin(_ gestureRecognizer: NSGestureRecognizer) -> Bool {
    let thePoint = gestureRecognizer.location(in: view)

    if let theView = view.hitTest(thePoint) {
        return !theView.handlesMouseEvents
    }
    else {
        return true
    }
}

如果我单击弹出菜单的中间,location(in:) 会返回值 (182, 16) 例如。对于非翻转视图,这对我来说似乎是正确的。但是hitTest() 返回该点的背景视图作为结果,而不是弹出按钮。

我做错了什么?

如果我使用手动翻转点 (y := height - y) 进行命中测试,我会得到弹出按钮作为结果。但我不想使用这种方法,因为它在我看来很难看。

如果我使用窗口的内容视图进行命中测试,If 似乎可以工作。但我仍然想知道为什么显示的方法不起作用。

【问题讨论】:

  • 来自hitTest(_:) 的文档:“参数:aPoint:视图父视图坐标系中的一个点,而不是视图本身。”。 view的superview翻了吗?
  • @Willeke:感谢您的提示。我从UIView 推断。阅读文档有时很有用。 ;) 如果我将view.superview 用于location(in:),一切都会按预期工作。您能否将您的评论转换为适当的答案以便我接受?

标签: macos cocoa nsview hittest nsclickgesturerecognizer


【解决方案1】:

hitTest(_:)的参数point

视图的父视图的坐标系中的一个点,而不是视图本身。

解决方案:在 superview 坐标中传递一个点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多