2

私のアプリケーションは、ウィンドウとそのウィンドウ内のボタンを XIB ファイルから 経由でロードしますNSWindowController。では-windowDidLoad、ウィンドウのサイズに基づいてボタンのフレームをプログラムで設定しました。ウィンドウのサイズは、表示されるボタンによって異なります)。自動サイズ変更マスクは、これらのボタンの XIB で適切に設定されます。問題は、ウィンドウが実際に表示されるときに、自動サイズ変更が適用されていないかのようにボタンが表示されることです。

NSButtonこの問題をデバッグする-setFrame:際に、[self frame]スーパーの-setFrame:. これを使用すると、フレームが 2 回設定されていることがわかります。最初はプログラム レイアウト コード (このフレームを A と呼びます) によって設定され、後で Cocoa がユーザー設定に基づいてウィンドウ サイズを調整します (自動サイズ変更マスクを適用し、フレームを B に設定します)。これらのフレームはすべて正しく見えます。

ただし、ウィンドウが表示されると、後者の-setFrame:呼び出しには永続的な効果がなかったかのようになります。ボタンのフレームは A に戻ります。これは、デバッガーを中断してフレームを出力することで確認できます。フレームの自動サイズ変更の更新は元に戻されています。しかし-setFrame:二度と呼ばれることはありませんでした。

なぜこの動作が見られるのかについてのアイデアはありますか?

4

1 に答える 1

0

superviewが によってサイズ変更されているときに最初に発生しますが、のメソッドが呼び出されsetFrameSize:たときに発生することが多く、ビューの が呼び出されます。あなたのケースでは、をサブクラス化し、のような空のメソッドでオーバーライドすることで、これをオーバーライドできますsuperviewlayoutSubtreeIfNeededresizeWithOldSuperviewSize:NSViewNSButtonresizeWithOldSuperviewSize:

- (void)resizeWithOldSuperviewSize:(NSSize)oldSize {}

NSViewただし、自動レイアウト システムによるサイズ変更を望まないことを示すことで、問題をよりエレガントに解決することもできます。これは次の方法で実行できます。

[<id> setAutoresizingMask:NSViewNotSizable];
[<id> setTranslatesAutoresizingMaskIntoConstraints:YES];

どこ<id>にあなたのインスタンスがあるNSViewので、おそらくアウトレットがあれば

@property (weak) IBOutlet NSButton *myButton;

次に、設定します

[self.myButton setAutoresizingMask:NSViewNotSizable];
[self.myButton setTranslatesAutoresizingMaskIntoConstraints:YES];

次に、必要なフレームで呼び出しsetFrame:ます。最初の行は、ビューのサイズを変更できないことを示していますが、2 行目は、自動レイアウト システムによってマスクを制約と見なす必要があることを示しています。それが役立つことを願っています!

編集: 申し訳ありませんが、何らかの理由で、私が提案したことの逆としてあなたの問題を読みました.自動レイアウトがあなたの変更を上書きしています. しかし、あなたはその反対を知りたいです。使用しsetAutoresizingMask:ている場合は試しましたsetTranslatesAutoresizingMaskIntoConstraints:YESか? 最小限の作業例を投稿していただけると助かります。

于 2015-04-10T16:22:58.477 に答える