在我的macOS应用程序中,我有一个自定义WebView。当用户将鼠标光标移动到WebView网页中的不同元素上时,如文本,链接等(我认为是子视图),光标会根据元素的类型自动更新。
我的要求是我想为WebView设置一个自定义游标(如果可能的话,甚至是我的整个应用程序),并且不要让它改变,至少直到我在代码的其他部分以编程方式更改它。我尝试在AppDelegate的applicationDidFinishLaunching:
方法中设置NSCursor,但它会立即重置。
我尝试了很多解决方案,例如设置NSTrackingArea
,向我的disableCursorRects
和NSApplication
发送NSWindow
,甚至监控游标更新事件,但没有太大成功。< / p>
那么有没有办法在我的应用程序中禁用所有NSCursor更新?我会将它设置为applicationDidFinishLaunching:
中的自定义光标,并希望它在应用程序运行时保持不变,或者我在代码中更改它。
答案 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并不能保证哪一个会在另一个上面。如果有人有更好的解决方案,或者可以改进这个解决方案,请随时发布。
希望这有助于某人!