如何处理带有圆角的NSView上的mouseEntered:事件

问题描述 投票:0回答:2

我正在创建一个具有圆角的视图,我希望视图在鼠标悬停在其上时突出显示。问题是当鼠标在角落之外时,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!")
}

如果我能澄清任何事情,请告诉我。谢谢您的帮助!

swift xcode cocoa nsview
2个回答
1
投票

首先,如果你的圆角足够小,我会说不用担心它,只是坚持使用矩形跟踪区域。大多数用户不太可能注意到,所以在我看来,创建它可能不值得。

如果你仍然想要这样做,就像Victor提到的那样,你应该使用描述视图形状的任何bezier路径进行检查,但这比仅仅检查mouseEntered()mouseExited()中的内容要复杂一些。您还需要实现mouseMoved()并在那里执行相同的路径检查,以便在光标移入和移出跟踪区域内的路径时正确响应。不要忘记配置您的跟踪区域以实际向您发送那些mouseMoved事件。

您可能还需要开始考虑性能。如果您最终实现mouseMoved,那么您的测试代码将在您的跟踪区域中运行每一帧光标运动,这可能会降低UI的响应速度。如果出现问题,可以使用许多优化,例如使用不使用mouseMoved的内部跟踪区域(在圆边内)或增加路径的flatness以降低测试的复杂性计算。正如您可能想象的那样,优化它会变得非常复杂。


1
投票

您可以使用event保存路径并检查containsPoint(point: CGPoint)的点是否在内部。有关更多信息,请参阅here

© www.soinside.com 2019 - 2024. All rights reserved.