我正在创建一个有圆角的视图,我希望当鼠标悬停在它上面时该视图高亮显示。问题是当鼠标位于角点之外时,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!")
}
如果我能澄清什么,请告诉我。谢谢你的帮助!
最佳答案
首先,如果你的圆角足够小,我会说不用担心,只要坚持矩形跟踪区域。大多数用户不太可能注意到,所以在我看来,这可能不值得你花时间去创建。
如果您仍然想这样做,正如Victor所提到的,您应该使用任何描述视图形状的bezier路径进行检查,但这比在mouseEntered()
和mouseExited()
内部检查要复杂一些。您还需要实现mouseMoved()
并在那里执行相同的路径检查,以便在光标在跟踪区域内的路径进出时正确响应。不要忘记将跟踪区域配置为实际向您发送那些mouseMoved
事件。
你可能还需要开始考虑表现。如果您最终实现了mouseMoved
,那么您的测试代码将在跟踪区域中运行光标移动的每一帧,这可能会降低UI的响应性。如果这是一个问题,例如使用内部跟踪区域(在圆角边缘内),不使用mouseMoved
或增加路径的flatness
来减少测试计算的复杂性,则可以使用许多优化。正如你可能想象的那样,优化这个过程变得非常复杂。
关于swift - 如何处理mouseEntered:带有圆角的NSView上的事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55163425/