2

Mac OS X 10.7の自動レイアウトでデザインを作ろうとしています。

私のアプリには、幅/高さが固定されたウィンドウがあります。私が本当にやりたいことは、ウィンドウ内のコントロールのサイズを変更することです。たとえば、クリックすると展開して折りたたむ必要がある検索フィールドがあります。NSPathControl を左側に配置します。これは、NSSearchField が拡大すると縮小するため、折りたたまれません。

現在、ウィンドウのサイズを変更すると機能しますが、コードでビューのフレームを設定すると機能しません。Autolayout はこれを単に無視します。

私は単にやってい[[this animator] setFrame:newFrame];ます。

自動レイアウトで有効にする必要があるものはありますか、またはコードでフレームを別の方法で設定する必要がありますか?

編集

self.translatesAutoresizingMaskIntoConstraints = YES;検索フィールドに設定することで、制約が機能するようになりました。これが素晴らしいアイデアかどうかはわかりません。

さらに、次のログが表示されます。

2012-12-12 19:41:30.958 Expanding Search[1428:303] Unable to simultaneously satisfy constraints:
(
    "<NSAutoresizingMaskLayoutConstraint:0x101a0d800 h=&-- v=&-- H:[ITSearchField:0x10011bb20]-(1)-|   (Names: '|':ITPathbar:0x10190a670 )>",
    "<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens.  And/or, break on objc_exception_throw to catch this in the debugger.
2012-12-12 19:41:32.835 Expanding Search[1428:303] 74
2012-12-12 19:41:32.854 Expanding Search[1428:303] Unable to simultaneously satisfy constraints:
(
    "<NSAutoresizingMaskLayoutConstraint:0x101a0d800 h=&-- v=&-- H:[ITSearchField:0x10011bb20]-(14.5)-|   (Names: '|':ITPathbar:0x10190a670 )>",
    "<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens.  And/or, break on objc_exception_throw to catch this in the debugger.
4

1 に答える 1

3

私の解決策


わかったので、ここで Github に公開しました。

また、別のより具体的な質問をしましたが、ここで解決されました。


問題は、autolayout を使用するときに setFrame: を呼び出すべきではないということです。正しい制約を取得し、それを変更する必要があります。幅を設定するだけで、フレームの原点が自動的に処理されます。

于 2012-12-13T18:11:38.810 に答える