はじめに
本文書では, macOS/iOSのソフトウェアのautolayout処理を、コードで実装する場合に関して、気づいた点/注意すべき点についてまとめます。
Autolayout処理
まとめ
AutoLayoutを制御するために、下記2のメソッドをオーバーライドします。
- Viewが要求するサイズを、intrinsicContentSizeの戻り値でかえす
- Viewに与えられたサイズを、setFrameSizeで取得し、Viewの内容に反映する
また、Viewの内容に応じた、拡張・縮小しやすさを定義します。
- setContentHuggingPriorityメソッドで、Viewの伸長されやすさを定義します
-
setContentCompressionResistancePriorityメソッドで、Viewの圧縮されやすさを定義します。
伸長/圧縮されやすさを表すパラメータについては、次節を参照してください。
経験的には、各Viewの必要最小限のサイズをintrinsic contents sizeで返して、そこからViewのサイズを大きくしていく方が上手くいく様です。また、水平もしくは垂直にViewを並べる場合は、NSStackViewもしくは、UIStackViewを使用しましょう。
優先順位
NSLayoutConstraint.Priorityで定義される定数の値とその意味です(macOS 10.15)。説明はマニュアルのgoogle翻訳です。
| 名前 | 即値 | 説明 |
|---|---|---|
| required | 1000.0 | 必要な制約 |
| defaultHigh | 750.0 | ボタンがコンテンツの圧縮に抵抗する優先度レベル |
| dragThatCanResizeWindow | 510.0 | ウィンドウのサイズを変更する可能性のあるドラッグの適切な優先度レベル |
| windowSizeStayPut | 500.0 | ウィンドウの現在のサイズの優先度 |
| dragThatCannotResizeWindow | 490.0 | たとえば、分割ビューの仕切りがドラッグされる優先度レベル |
| defaultLow: | 250.0 | ボタンがその内容を水平方向に保持する優先度レベル |
| fittingSizeCompression | 50.0 | fitingSizeの結果は、ビューのコンテンツを表示するのに十分な大きさのサイズです |
View毎の処理
NSTextView
- スクロールバー付きのNSTextViewのサイズ変更については、NSTextViewそのものでなく、それを含有するNSScrollViewに対して実施する。
NSTabViewController
- ビュー毎のWindowのリサイズ
preferredContentSizeを使用して各ビュー(アイテム)のサイズを使用します。
preferredContentSizeの値は、viewDidAppearメソッドの中で取得します。以降のviewWillAppearメソッドの中で、その値を使ってNSWindowのcontents sizeを変更します。
変更履歴
- 2020/12/29
NSTabViewControllerの項を追加 - 2021/02/22 「まとめ」を追加