1

スーパービューでマウスでドラッグできるさまざまなコンテンツを持つ、サブクラス化された多数の NSView (フレーム) を持つプログラムを作成しています。すべてのビューには contentView と呼ばれる 1 つのサブビューが含まれ、さらに複雑な階層を含むことができます。

contentView として編集不可の NSTextField がある場合、mouseDown: および mouseDragged: イベントは問題なくスーパービューに渡され、ドラッグは正常に機能します。

mouseDown:    ---> [NSTextField] ---> [Frame]
mouseDragged: ---> [NSTextField] ---> [Frame]

contentView が多数の NSTextField を含む NSView のサブクラスである場合、mouseDragged: イベントは NSTextField からスーパービューに渡されません。

mouseDown:    ---> [NSTextField] ---> [subclassed NSView] ---> [Frame]
mouseDragged: ---> [NSTextField] -x-> 

フレームが mouseDown: イベントを受け取ります。NSTextFields の間のギャップをクリックして、contentView を直接ドラッグするとうまくいきます。

NSTextFields は、contentView で次のように設定されます。

NSTextField *textfield = [[NSTextField alloc] initWithFrame:rect];
[textfield setBordered:NO];
[textfield setSelectable:NO];
[textfield setEditable:NO];
[textfield setTextColor:[NSColor blackColor]];
[textfield setBackgroundColor:[NSColor clearColor]];
[textfield setDrawsBackground:NO];
[textfield setAlignment:NSRightTextAlignment];
[textfield setFont:[NSFont fontWithName:@"Helvetica" size:14]];
[self addSubview:textfield];
[textfield release];

サブクラス化された NSTextField とサブクラス化された NSView の両方に mouseDragged: メソッドを追加しようとしましたが、メソッドを除外しました。どちらも違いはありませんでした。この問題は、同じサブビュー レベルにある他の NSControls にも存在します。

- (void)mouseDragged:(NSEvent *)theEvent
{
    [super mouseDragged:theEvent];
}

また

- (void)mouseDragged:(NSEvent *)theEvent
{
    [self.superview mouseDragged:theEvent];
}

現時点では、この動作はまったく直感的ではないように思えます。足りないものはありますか?(私は Mountain Lion で Xcode 4.6.2 を使用しています。)

4

2 に答える 2

2

NSTextView には、マウスに対する特別な処理があります。NSTextField についてはわかりませんが、同じ動作を示す可能性があります。たとえば、mouseUp イベントはありません。mouseDown イベントがローカル ループに入ります (おそらくコンテンツをドラッグするため)。クラスで mouseDown を上書きし、NSView の mouseDown を呼び出して、NSTextField のマウス ダウンを回避することができます。これを行う方法については、この SO の質問を参照してください。

于 2013-04-20T09:50:50.137 に答える
1

わかりました、私は答えを見つけました。マウスイベントを遮断する NSTextFields とは何の関係もありませんでした。NSView をクリックすると、コンテンツがまだ正確かどうかを確認するルーチンが呼び出されました。これにより、すべてのサブビューが解放され、ビュー全体が再レイアウトされます。これにより、同じサブビューの mouseDown イベントからドラッグ イベントが自然に遮断されます (もう存在しませんでした)。

NSView が既にドラッグ用にアクティブ化されているかどうかを確認することで問題を解決しました。これは最初に行う必要がありました。だから、私のエラーであり、私のソースコード全体なしでは誰も解決できなかったでしょう...

于 2013-04-21T07:26:54.543 に答える