3

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

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

我尝试了许多解决方案,例如设置一个NSTrackingArea,发送disableCursorRects到我的NSApplicationNSWindow,甚至监视游标更新事件,但没有太大成功。

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

4

2 回答 2

1

您可以在 WebView 中使用用户样式表来设置 html 元素的默认光标。

WebPreferences *preferences = [[[WebPreferences alloc] initWithIdentifier:@"TestIdentifier"] autorelease];

NSURL *stylesheetURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"yosemite-stylesheet" withExtension:@"css" subdirectory:@"Welcome"];

preferences.userStyleSheetEnabled = YES;
preferences.userStyleSheetLocation = stylesheetURL;


self.webView.preferences = preferences;
于 2017-05-08T14:39:26.703 回答
1

找到了对我有用的解决方案!我是这样做的:

子类NSView化并覆盖该resetCursorRects方法,其中 sendaddCursorRect:cursor:及其边界作为光标 rect 和所需的光标(在此处描述)。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)

需要注意的一些额外事项:

  • 使用 anNSTrackingArea而不是光标 rect 似乎效果不佳。对我来说没有。
  • 我曾在自定义本身上尝试过上述方法WebView,但没有奏效。的WebView默认跟踪区域/光标矩形总是干扰。就像上面的代码一样,在它上面添加一个子视图会阻止这种行为。
  • 最后,覆盖视图应该WebView. 如果两者都是同一个 superview 的兄弟视图,Cocoa 不保证哪一个会在另一个之上。

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

希望这对某人有帮助!

于 2017-05-10T08:06:04.800 回答