【发布时间】: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