0

NSStatusItem の位置に配置された NSWindow があります。ウィンドウは、独自のメソッドを使用してサイズを変更できますsetSize:。これは、次のようにウィンドウに適したフレームを取得するだけです。

- (NSRect)frameForSize:(NSSize)size {
    NSRect newFrame = self.frame;
    newFrame.origin.x += (newFrame.size.width - size.width) / 2;
    newFrame.origin.y += (newFrame.size.height - size.height);
    newFrame.size = size;

    return newFrame;
}

これにより、幅が変更された場合でも、ウィンドウを中央に配置できます。これはコードを使用して簡単に呼び出すことができますが、ユーザーがウィンドウの端を使用してサイズを変更すると、setFrame:display: が直接呼び出されます。デリゲート メソッドがありますが、windowDidResize:notification:そこにフレームを設定すると、2 回設定されて遅れます。

ウィンドウが実際にサイズ変更される前に呼び出されるイベントはありますか? そうでない場合、どうすればよいですか?

4

1 に答える 1

2

上記のコメントによると、あなたはサブクラス化していNSWindowます。-frameForSize:メソッドがサブクラス上にあると仮定して、次のようNSWindowにオーバーライド-[NSWindow setFrame:display:]します。

- (void)setFrame:(NSRect)frameRect display:(BOOL)flag
{
    frameRect = (self.inLiveResize) ? [self frameForSize:frameRect.size] : frameRect;
    [super setFrame:frameRect display:flag];
}

私はこれをテストしました。ウィンドウはスムーズにサイズ変更され、常に中央に配置されます。

于 2012-10-24T17:17:37.640 に答える