1

その内容を介してドラッグできるドラッグ可能な NSWindow を作成しました。タイトル バーがありません (フチなし)。

ドラッグは正常に機能しますが、ちらつきが頻繁に発生します。ウィンドウがすぐに間違った位置に移動してから、マウスがある場所に戻っているようです (マウスを押したままにします)。また、imac よりも macbook の方がうまく機能するようです。

誰かが私が間違っていることを理解できますか?

init で、次の 2 つのメソッドを呼び出しました。

[self setMovableByWindowBackground:YES];
[self setMovable:YES];

使用される変数は次のとおりです。

NSPoint currentLocation;
NSPoint newOrigin;
int offsetX,offsetY;

そして、ドラッグに関するコードは次のとおりです。

- (void)mouseMoved:(NSEvent *)theEvent{
}


- (void)mouseDown:(NSEvent *)theEvent{

    currentLocation = [self convertBaseToScreen:[self mouseLocationOutsideOfEventStream]];

    offsetX = currentLocation.x - [self frame].origin.x;
    offsetY = currentLocation.y - [self frame].origin.y;
}

- (void)mouseDragged:(NSEvent *)theEvent{
    currentLocation = [self convertBaseToScreen:[self mouseLocationOutsideOfEventStream]];

    newOrigin.x = currentLocation.x - offsetX;
    newOrigin.y = currentLocation.y - offsetY;

    [self setFrameOrigin:newOrigin];

}

編集: OK、前述のように、これは透明なボーダレス NSPanel です。はい、上記のコードは必要ないようです。

しかし、ウィンドウがドラッグされている場所が必要であり、継続的に必要です。

フレームの原点を次のように取得した場合:

self.frame.origin

これは、間違った番号を報告します。cocoa がこの内部値を更新するまでには、しばらく時間がかかるようです。

第二に、パネルはアクティブ化されていません。最初にロードされた (フォーカスされた) ときに mouseDragged が呼び出されたときに移動すると、正常に動作します。しかし、別のアプリとやり取りしてから戻ったときはそうではありません。mouseDown と mouseUp のみが呼び出されます。

4

2 に答える 2

0

NSWindowDidMove 通知を受け取りますが、ライブではありません

ライブアップデートが必要な場合、これはデフォルトでは不可能です。サイズ変更時と同様に、フレームは更新されません。

マウスでウィンドウを移動するときに通知を受け取る方法を参照してください。その方法に関するいくつかのリンクについて

于 2013-03-17T16:11:24.700 に答える
0

-setMovableByWindowBackground:が呼び出される場合、マウス トラッキング コードは必要ありません。あなたは基本的にその作業を複製しているだけです。その音から、-initメソッドが呼び出されていないと思います.xib(-initWithCoder:代わりに呼び出す)からロードしている可能性が最も高いです。

ウィンドウが排他的に xib の読み込みによって作成されている場合は、上記のすべてのコードを次のように置き換えます。

- (void)awakeFromNib
{
    [self setMovableByWindowBackground:YES];
}

ちらつきが見られた理由については、マウス入力が画面の更新に同期されていないためだと思います。そのため、プログラムでウィンドウをマウスに追従させることは、マウスの動きごとに更新するよりも少し複雑です。しかし、NSWindow に任せれば、まったく心配する必要はありません。

于 2013-03-15T23:42:18.513 に答える