【发布时间】:2011-01-07 21:32:59
【问题描述】:
我需要确定鼠标位置是否在 NSView 的矩形内。
我会使用NSPointInRect(point, rect),但我需要将矩形坐标转换为屏幕坐标,但我不确定如何。任何帮助将不胜感激!
【问题讨论】:
-
你能给我们一个理由吗?一般来说,这种技术不是一个好主意,但如果不知道你在写什么,就很难说。
标签: objective-c cocoa macos nsview
我需要确定鼠标位置是否在 NSView 的矩形内。
我会使用NSPointInRect(point, rect),但我需要将矩形坐标转换为屏幕坐标,但我不确定如何。任何帮助将不胜感激!
【问题讨论】:
标签: objective-c cocoa macos nsview
这样的东西应该适合你:
NSView* myView; // The view you are converting coordinates to
NSPoint globalLocation = [ NSEvent mouseLocation ];
NSPoint windowLocation = [ [ myView window ] convertScreenToBase: globalLocation ];
NSPoint viewLocation = [ myView convertPoint: windowLocation fromView: nil ];
if( NSPointInRect( viewLocation, [ myView bounds ] ) ) {
// Do your thing here
}
我个人没有使用这么多局部变量,但希望这能让这个例子更清晰。
【讨论】:
使用 NSView 的 convertPoint:fromView: 方法和 fromView 作为 nil 将窗口坐标中的点转换为视图的坐标系。
将鼠标点转换为视图坐标系后,我将使用 NSView 的 mouse:inRect: 方法而不是 NSPointInRect,因为前者也考虑了翻转坐标系。
或者,您可以使用Tracking Area Object。
【讨论】:
self.bounds 传递给NSView's mouse:inRect: 中的NSRect 参数,向上发送self.frame 将抵消坐标。
NSView isMousePoint 功能对我有用,无需担心任何 CG。
func isMouseInView(view: NSView) -> Bool? {
if let window = view.window {
return view.isMousePoint(window.mouseLocationOutsideOfEventStream, in: view.frame)
}
return nil
}
【讨论】:
一些使用 mouse:inRect: 的代码:(推荐的方式;考虑翻转坐标)
CGPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
CGRect rect = [self bounds];
if ([self mouse:point inRect:rect]) {
}
【讨论】:
这些答案都没有考虑到视图可能不是矩形的。
这是一种适用于非矩形视图的通用方法。想想表盘或复杂的路径形状。
此代码 sn-p 将为您提供来自 globalPoint(又名 globalToLocal)的 localPoint。 (0,0 窗口空间中的 GlobalPoint)如果您将参数更改为“toView”,那么您将获得一个“localToGlobal”点。
let localPoint = convertPoint(aPoint, fromView: self.window?.contentView)
如果该点是否在路径内,下面的代码将返回 true 或 false。
CGPathContainsPoint(someCGPath,nil,localPoint,true)
注意: aPoint是从hitTest中的参数导出的globalPoint,也可以从:
(self.window?.mouseLocationOutsideOfEventStream)!
注意: 可能有更正确的方法来做到这一点。但这有效,并且不关心翻转视图。
【讨论】: