如何在我的应用程序中禁用所有NSCursor更新?

时间:2017-05-08 13:00:28

标签: macos cocoa webview nscursor

在我的macOS应用程序中,我有一个自定义WebView。当用户将鼠标光标移动到WebView网页中的不同元素上时,如文本,链接等(我认为是子视图),光标会根据元素的类型自动更新。

我的要求是我想为WebView设置一个自定义游标(如果可能的话,甚至是我的整个应用程序),并且不要让它改变,至少直到我在代码的其他部分以编程方式更改它。我尝试在AppDelegate的applicationDidFinishLaunching:方法中设置NSCursor,但它会立即重置。

我尝试了很多解决方案,例如设置NSTrackingArea,向我的disableCursorRectsNSApplication发送NSWindow,甚至监控游标更新事件,但没有太大成功。< / p>

那么有没有办法在我的应用程序中禁用所有NSCursor更新?我会将它设置为applicationDidFinishLaunching:中的自定义光标,并希望它在应用程序运行时保持不变,或者我在代码中更改它。

1 个答案:

答案 0 :(得分:0)

找到适合我的解决方案!以下是我的表现方式:

子类NSView并覆盖resetCursorRects方法,其中发送addCursorRect:cursor:的边界为光标rect和所需的光标(描述为here)。然后使用与NSView相同的框架创建此自定义WebView 的实例,并将其作为子视图添加到更晚的版本中。这将作为WebView上的透明叠加层。它仅影响光标,不会干扰鼠标点击或按键。

这里是PyObjC中的代码(该概念也应该适用于Objective C):

# Overlay View (NSView subclass)
class OverLayView(AppKit.NSView):
   def resetCursorRects(self):
       self.addCursorRect_cursor_(self.bounds(), my_custom_cursor)

# In my main class
    ...
    self.overlay = OverLayView.alloc().initWithFrame_(self.webview.bounds())
    self.webview.addSubview_(self.overlay)
    ...

如果我想将光标重置为自动,我可以删除此叠加视图,或者甚至更好,通过发送setHidden:消息将其暂时隐藏:

self.overlay.setHidden_(Foundation.YES)

需要注意的其他一些事项:

  • 使用NSTrackingArea而不是光标rect似乎不能正常工作。对我而言,它没有。
  • 我在自定义WebView上尝试了上述方法,但它没有用。 WebView的默认跟踪区域/光标值总是会干扰。在上面添加子视图会阻止此行为,如上面的代码那样。
  • 最后,叠加视图应该是 WebView的子视图。如果两者都是同一个超级视图的兄弟视图,那么Cocoa并不能保证哪一个会在另一个上面。

如果有人有更好的解决方案,或者可以改进这个解决方案,请随时发布。

希望这有助于某人!