[macOS/iOS] Autolayout覚書


はじめに

本文書では, 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 「まとめ」を追加