2

この質問のように、NSWindowのcontentViewであるNSViewがあり、垂直に積み重ねられた複数のサブビューが含まれています。それらのいくつかは固定サイズであり、それらのいくつかは開示ボタンで拡大または折りたたむことができます。

サブビューの1つを展開または折りたたむと、他のすべてが調整され、それに応じてスーパービューとウィンドウのサイズが変更される、一種の「アコーディオン」効果を実装したいと思います。

自動レイアウトで適切な制約のセットを設定することでこれを達成できるはずであるように思えますが、今では初期レイアウトをうまく実行しています。しかし、スーパービューが自動的にサイズを変更してサブビューをハグするように制約を設定する方法がわかりません。

上にリンクされた質問のOPは答えを得ることができず、私が独立して実装し始めたような彼自身の解決策を提供しましたが、トリックを知っている自動レイアウトの達人がいる場合に備えて、もう一度それを捨てると思いました。サブビューのサイズを手動で計算したり、スーパービューのサイズを手動でリセットしたりせずに、自動レイアウトを利用して、スーパービューにサブビューをハグさせる方法があるはずです。

誰もが方法を知っていますか?

4

2 に答える 2

3

自動レイアウトはクールで包括的です。そして難解です。

私は一生懸命努力しましたが、やりたいことを実行する一連の制約を思い付くことができませんでした。NSViewをスーパービュー内に垂直にスタックし、上部のサブビューがスーパービューの上部に固定され、サブビューのスタックを下に行くと、それぞれの上部が上記のものを最後に、最後のサブビューの下端をスーパービューの下端に固定し、プログラムで1つ以上のサブビューのサイズを変更して、スーパービューの下部を引き上げたり押し下げたりできるようにします。サブビューをハグし続けます。

最後のピースを除いて、すべてが期待どおりに機能します。下部のサブビューをスーパービューの下部に固定しようとすると、自動レイアウトですべての制約を満たすことができません。制約を満たすためにスーパービューのサイズを変更することは、アルゴリズムに含まれていないようです。それか、設定が必要な他の制約がありません。

そして、私がこの問題に取り組んでいる間、デバッガーを見ると、ウィンドウのcontentViewとウィンドウフレームの間に設定不可能な制約があるように見えます。これらの制約をいじることができれば、元のスキームが機能するのではないかと思います。

とにかく、私は自動レイアウトを使用するソリューションを思いつきました。必要なのはNSViewをサブクラス化し、intrinsicSizeメソッドに数行のコードを入れてから、そのサブクラスを使用することだけだったので、自動レイアウトが行うことを望んでいたものにかなり近いです。スーパービュー。

折りたたみ可能なビューの基本クラスと、 githubですべての動作デモを含むxcodeプロジェクトを作成しました。

于 2012-05-08T18:50:47.040 に答える
0

あなたのような状況では、Xcodeによって自動的にインストールされた制約がレイアウトを壊す可能性があることを確認できます。たとえば、可変垂直ビューに明示的な制約がない場合、IBが自動制約を追加して、レイアウトを明確にする可能性があります。後で、別の制約をインストールしてそのビューのサイズを変更しようとすると、自動レイアウトエラーが発生します。

-intrinsicContentSize考えられる解決策の1つ(実装や他のサブクラス化が不足している)は、すべての自動制約をIBで探し出すことです。これにより、レイアウトが妨げられ、優先度の低い場所に明示的な制約を設定してみてください。ただし、これは常に機能するわけではありません。

もう1つの残忍な解決策は、のすべての制約を削除してから、必要な制約-awakeFromNibのみを設定することです。もちろん、プログラムで邪魔になる制約のみを削除してみることができますが、次に.xibで何かを変更したときに、問題がまったく別の場所で再発する可能性があるため、これは堅牢ではありません。

通常、すべてを正しく機能させるには、両方を少し行う必要がありました。

于 2012-08-22T04:58:37.570 に答える