如何处理 mouseEntered:带圆角的 NSView 上的事件
How to handle mouseEntered: events on an NSView with rounded corners
我正在创建一个带有圆角的视图,我希望该视图在鼠标悬停在它上面时突出显示。问题是当鼠标在角落之外时 NSTrackingArea
注册了一个 mouseEntered:
事件。有没有办法覆盖它如何确定它是否在视图中?
我试过:
- 将
.inVisibleRect
添加到 NSTrackingArea.Options
- 覆盖
isMousePoint:in:
如有必要,我可以实现 mouseEntered:
以忽略所有点不在矩形内的事件,但我想知道是否有更优雅的方式(即 mouseEntered:
被调用的地方仅当鼠标实际进入视图时)。
这是我用来绘图的代码(对我有用):
...
override func draw(_ dirtyRect: NSRect)
{
let path = NSBezierPath(roundedRect: dirtyRect, xRadius: radius, yRadius: radius)
path.addClip()
backgroundColor.setFill()
dirtyRect.fill()
}
...
override func mouseEntered(with event: NSEvent)
{
print("Mouse entered!")
}
如果我能澄清任何事情,请告诉我。感谢您的帮助!
您可以保存路径并使用containsPoint(point: CGPoint)
检查event
的点是否在里面。
有关详细信息,请参阅 here。
首先,如果你的圆角足够小,我会说不要担心,只要坚持使用矩形跟踪区域即可。大多数用户不太可能注意到,所以我认为它可能不值得您花时间创建。
如果你仍然想这样做,正如 Victor 提到的那样,你应该使用描述视图形状的任何贝塞尔曲线路径进行检查,但这比仅在 mouseEntered()
和 mouseExited()
。您还需要实施 mouseMoved()
并在那里进行相同的路径检查,以便在光标移入和移出跟踪区域内的路径时做出正确响应。不要忘记配置您的跟踪区域以实际向您发送那些 mouseMoved
事件。
您可能还需要开始考虑性能。如果您最终实施 mouseMoved
,那么您的测试代码将是 运行 光标在跟踪区域中移动的每一帧,这可能会降低 UI 的响应能力。如果这最终成为一个问题,您可以使用许多优化,例如使用不使用 mouseMoved
的内部跟踪区域(在圆形边缘内)或增加 flatness
降低测试计算复杂度的路径。正如您想象的那样,优化它很快就会变得复杂。
我正在创建一个带有圆角的视图,我希望该视图在鼠标悬停在它上面时突出显示。问题是当鼠标在角落之外时 NSTrackingArea
注册了一个 mouseEntered:
事件。有没有办法覆盖它如何确定它是否在视图中?
我试过:
- 将
.inVisibleRect
添加到NSTrackingArea.Options
- 覆盖
isMousePoint:in:
如有必要,我可以实现 mouseEntered:
以忽略所有点不在矩形内的事件,但我想知道是否有更优雅的方式(即 mouseEntered:
被调用的地方仅当鼠标实际进入视图时)。
这是我用来绘图的代码(对我有用):
...
override func draw(_ dirtyRect: NSRect)
{
let path = NSBezierPath(roundedRect: dirtyRect, xRadius: radius, yRadius: radius)
path.addClip()
backgroundColor.setFill()
dirtyRect.fill()
}
...
override func mouseEntered(with event: NSEvent)
{
print("Mouse entered!")
}
如果我能澄清任何事情,请告诉我。感谢您的帮助!
您可以保存路径并使用containsPoint(point: CGPoint)
检查event
的点是否在里面。
有关详细信息,请参阅 here。
首先,如果你的圆角足够小,我会说不要担心,只要坚持使用矩形跟踪区域即可。大多数用户不太可能注意到,所以我认为它可能不值得您花时间创建。
如果你仍然想这样做,正如 Victor 提到的那样,你应该使用描述视图形状的任何贝塞尔曲线路径进行检查,但这比仅在 mouseEntered()
和 mouseExited()
。您还需要实施 mouseMoved()
并在那里进行相同的路径检查,以便在光标移入和移出跟踪区域内的路径时做出正确响应。不要忘记配置您的跟踪区域以实际向您发送那些 mouseMoved
事件。
您可能还需要开始考虑性能。如果您最终实施 mouseMoved
,那么您的测试代码将是 运行 光标在跟踪区域中移动的每一帧,这可能会降低 UI 的响应能力。如果这最终成为一个问题,您可以使用许多优化,例如使用不使用 mouseMoved
的内部跟踪区域(在圆形边缘内)或增加 flatness
降低测试计算复杂度的路径。正如您想象的那样,优化它很快就会变得复杂。