マウスをドラッグしている間、カーソルを動かしたままにできないのはなぜですか? ドラッグを開始するとすぐに、「矢印」に戻ります(起動後にアプリデリゲートで開いた手として設定しても)。
- (void)mouseDown:(NSEvent *)event
{
[[NSCursor closedHandCursor] push];
}
- (void)mouseUp:(NSEvent *)event
{
[NSCursor pop];
}
マウスをドラッグしている間、カーソルを動かしたままにできないのはなぜですか? ドラッグを開始するとすぐに、「矢印」に戻ります(起動後にアプリデリゲートで開いた手として設定しても)。
- (void)mouseDown:(NSEvent *)event
{
[[NSCursor closedHandCursor] push];
}
- (void)mouseUp:(NSEvent *)event
{
[NSCursor pop];
}
ドラッグ中に他のビューでカーソルを変更したくない場合は、-mouseDown で行うことができます。
[[self window] disableCursorRects];
および -mouseUp:
[[self window] enableCursorRects];
[[self window] resetCursorRects];
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:
メソッドを呼び出すことができます。
ドラッグ中にサブビューのフレームを変更していたため、カーソルがリセットされたように見えるという同じ問題が発生しました。オプションでトラッキングエリアを追加し、.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
}
}