4

私はこれに何時間も取り組んできましたが、何が悪かったのかわかりません。NSTextViewのサブビューであるボタン用のカスタムカーソルが必要です。追跡領域を追加し、マウスがボタンに入ったときにcursorUpdateメッセージを送信します。

実際、cursorUpdateメソッドは、マウスが追跡領域に入るたびに呼び出されます。ただし、カーソルはIBeamCursorのままです。

何か案は?

Apple Docsのリファレンス:カーソル更新イベントの管理

- (void)cursorUpdate:(NSEvent *)event {
    [[NSCursor arrowCursor] set];
}

- (void)myAddTrackingArea {
    [self myRemoveTrackingArea];

    NSTrackingAreaOptions trackingOptions = NSTrackingCursorUpdate | NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow;
    _trackingArea = [[NSTrackingArea alloc] initWithRect: [self bounds] options: trackingOptions owner: self userInfo: nil];
    [self addTrackingArea: _trackingArea];
}

- (void)myRemoveTrackingArea {
    if (_trackingArea)
    {
        [self removeTrackingArea: _trackingArea];
        _trackingArea = nil;
    }
}
4

3 に答える 3

5

私は同じ問題に遭遇しました。

問題は、イベントNSTextViewを受け取るたびにカーソルを更新することです。mouseMoved:このイベントは、 の自己更新によってトリガーされNSTrackingAreaます。これは、 の内部のNSTextView可視部分を常に追跡します。だから私が考えることができるおそらく2つの解決策があります。NSTextViewNSScrollView

  1. Cocoa によって提供されるトラッキング エリアをオーバーライドupdateTrackingAreasして削除し、ボタンを除外する代わりに常に新しいトラッキング エリアを作成するようにしてください。(私はこれをしません!)

  2. オーバーライドmouseMoved:して、カーソルがボタンの上にあるときにスーパーが呼び出されないようにします。

    - (void)mouseMoved:(NSEvent *)theEvent {
        NSPoint windowPt = [theEvent locationInWindow];
        NSPoint superViewPt = [[self superview]
              convertPoint: windowPt  fromView: nil];
        if ([self hitTest: superViewPt] == self) {
            [super mouseMoved:theEvent];
        }
    }
    
于 2014-02-11T16:46:11.673 に答える
0

Google検索でこれに出くわしたので、ソリューションを投稿すると思いました。

  1. NSTextView/NSTextField をサブクラス化します。
  2. ドキュメントの手順に従ってNSTrackingArea を作成します。次のようになります。このコードをサブクラスの init メソッドに入れます (メソッドも追加しupdateTrackingAreasます)。

    NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:(NSTrackingMouseMoved | NSTrackingActiveInKeyWindow) owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];
    self.trackingArea = trackingArea;
    
  3. mouseMoved:次に、メソッドをサブクラスに追加する必要があります。

    - (void)mouseMoved:(NSEvent *)theEvent {
        NSPoint point = [self convertPoint:theEvent.locationInWindow fromView:nil];
        if (NSPointInRect(point, self.popUpButton.frame)) {
            [[NSCursor arrowCursor] set];
        } else {
            [[NSCursor IBeamCursor] set];
        }
    }
    

注: これself.popUpButtonは、NSTextView/NSTextField のサブビューであるボタンです。

それでおしまい!あまりにも難しいことではありません-mouseMoved:代わりに使用する必要がありcursorUpdate:ました. これを理解するのに数時間かかりました。誰かがそれを使用できることを願っています。

于 2014-06-24T00:13:11.363 に答える