gpt4 book ai didi

swift - 如何处理mouseEntered : events on an NSView with rounded corners

转载 作者:行者123 更新时间:2023-11-28 11:36:32 26 4
gpt4 key购买 nike

我正在创建一个带有圆角的 View ,并且我希望在鼠标悬停在它上面时突出显示该 View 。问题是 NSTrackingArea 注册了一个 mouseEntered: 事件,当鼠标在角落之外时。有没有办法覆盖它如何确定它是否在 View 中?

我试过:

  • .inVisibleRect 添加到 NSTrackingArea.Options
  • 重写 isMousePoint:in:

如有必要,我可以实现 mouseEntered: 以忽略所有点不在矩形内的事件,但我想知道是否有更优雅的方式(即 mouseEntered: 只有当鼠标实际进入 View 时才会被调用。

这是我用来绘图的代码(对我有用):

...

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 提到的,你应该使用描述 View 形状的任何贝塞尔曲线路径进行检查,但这比在 mouseEntered() 中检查要复杂一些> 和 mouseExited()。您还需要实现 mouseMoved() 并在那里执行相同的路径检查,以便在光标移入和移出跟踪区域内的路径时做出正确响应。不要忘记配置您的跟踪区域以实际向您发送那些 mouseMoved 事件。

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

关于swift - 如何处理mouseEntered : events on an NSView with rounded corners,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55163425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com