为什么我不能让光标在鼠标拖动期间保持不变?一旦我开始拖动,它就会恢复为“箭头”(即使我在启动后将其设置为应用代理中的开放手)。
- (void)mouseDown:(NSEvent *)event
{
[[NSCursor closedHandCursor] push];
}
- (void)mouseUp:(NSEvent *)event
{
[NSCursor pop];
}
答案 0 :(得分:17)
如果您不希望其他视图在拖动时更改光标,则可以在-mouseDown中执行:
[[self window] disableCursorRects];
和in -mouseUp:
[[self window] enableCursorRects];
[[self window] resetCursorRects];
答案 1 :(得分:11)
尝试使用addCursorRect:cursor:
为您查看设置光标。
覆盖视图的resetCursorRects
:
- (void)resetCursorRects
{
[super resetCursorRects];
if(drag) {
[self addCursorRect:self.bounds cursor:[NSCursor closedHandCursor]];
}
}
您需要致电invalidateCursorRectsForView:
强制更新光标:
[self.window invalidateCursorRectsForView:self];
但是,如果您希望在视图之外使用不同的光标,则可以在[[NSCursor closedHandCursor] set]
方法中调用mouseDragged:
。
答案 2 :(得分:0)
我遇到了同样的问题,原因是在拖动过程中我正在修改子视图的框架,这似乎重置了光标。当使用.cursorUpdate
选项添加跟踪区域并在cursorUpdate(with:)
内重置光标时,它似乎可以正常工作。
class MyViewController: NSViewController {
var cursor: NSCursor?
override func viewDidLoad() {
super.viewDidLoad()
view.addTrackingArea(NSTrackingArea(rect: .zero, options: [.activeInKeyWindow, .inVisibleRect, .cursorUpdate], owner: self))
}
override func mouseDown(with event: NSEvent) {
cursor = NSCursor.closedHand
}
override func cursorUpdate(with event: NSEvent) {
cursor?.set()
}
override func mouseUp(with event: NSEvent) {
cursor = nil
}
}