15

マウスをドラッグしている間、カーソルを動かしたままにできないのはなぜですか? ドラッグを開始するとすぐに、「矢印」に戻ります(起動後にアプリデリゲートで開いた手として設定しても)。

- (void)mouseDown:(NSEvent *)event
{
   [[NSCursor closedHandCursor] push];
}

- (void)mouseUp:(NSEvent *)event
{
   [NSCursor pop];
}
4

3 に答える 3

23

ドラッグ中に他のビューでカーソルを変更したくない場合は、-mouseDown で行うことができます。

[[self window] disableCursorRects];

および -mouseUp:

[[self window] enableCursorRects];
[[self window] resetCursorRects];
于 2012-10-16T10:55:36.870 に答える
12

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:メソッドを呼び出すことができます。

于 2012-07-02T06:59:04.490 に答える
1

ドラッグ中にサブビューのフレームを変更していたため、カーソルがリセットされたように見えるという同じ問題が発生しました。オプションでトラッキングエリアを追加し、.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
    }
    
}
于 2020-10-15T11:33:16.470 に答える