📏

SwiftUIのframe(min... max...)の英語の説明を解読する

2024/02/01に公開

SwiftUIのframe(min... max...)の説明ページを読んでいきます。

https://developer.apple.com/documentation/swiftui/view/frame(minwidth:idealwidth:maxwidth:minheight:idealheight:maxheight:alignment:)

このページの解説は文だけで理解しようとするとかなり意味不明なのですが、いろいろな調査によってある程度挙動がつかめたので英文を解読します。

メソッド名の下

Positions this view within an invisible frame having the specified size constraints.

このviewを見えないフレームの中に配置します。フレームはサイズの制約を持っています。

メソッド名のすぐ下にあるこの文。

このview(this view)とは a.frame(〜 と書いた時の a のこと。フレームのサイズの制約はminやmaxで与えられる情報のことかと。このthis viewという言い方はこの後も何度も同じ意味で出てきます。frame(min... max...) メソッドは、view自体を変更するというよりも新たな枠を外側に配置するもののようです。

Parameters

alignment

The alignment of this view inside the resulting frame. Note that most alignment values have no apparent effect when the size of the frame happens to match that of this view.

(alignmentとは)結果のフレームの中でのこのviewの配置の仕方。このviewのサイズと結果のframeのサイズが同じになったときは効果はないように見えます。

ここでも、このviewというのは a.frame(〜 と書いた時の a のこと。結果のフレームというのは frame によって作られた外側のフレームです。で、元のviewと外側のフレームが同じ大きさなら、外側のフレームにすきまなく元のviewが入っているので、上配置や左配置という指令によって何も変わらないので効果がないように見えると言っています。

Discussion

この先の場合分けは

  • 縦情報あり、横情報あり
  • 縦情報あり、横情報なし
  • 縦情報なし、横情報あり
  • 縦情報なし、横情報なし

の場合分けか

  • min情報あり、max情報あり
  • min情報あり、max情報なし
  • min情報なし、max情報あり
  • min情報なし、max情報なし

の場合分けか、把握すること。

Always specifyの段落

Always specify at least one size characteristic when calling this method. Pass nil or leave out a characteristic to indicate that the frame should adopt this view’s sizing behavior, constrained by the other non-nil arguments.

このメソッドを呼び出すときは、常に少なくとも1つのサイズ属性を指定してください。フレームが(ある方向で)このビューのサイズを採用することを示すためには、nilを渡すか、特性を省略してください。もう片方はnil以外の引数によって制約されます

at least one size で必ず何かを指令するように言っています(width1個、height0個はOK)。
Pass nil or leave out a characteristic は指令しない状態のことです。 nil を渡すか何も書かない。この文は命令形で主語なし。
the frame should adopt this view’s sizing behavior はこのviewのサイズを結果フレームが採用することを言っています。
constrained by the other non-nil arguments はもう片方の明記された指令に従うと言っています。必ず1つのサイズ属性が必要なので、片方が無しならもう片方は制約があります。

  • 何か一つは指定すること
  • 指定しない軸はこのviewのサイズが適用される

がポイントです。

The size proposedの段落

The size proposed to this view is the size proposed to the frame, limited by any constraints specified, and with any ideal dimensions specified replacing any corresponding unspecified dimensions in the proposal.

このビューに提案されるサイズは、フレームに提案されるサイズであり、指定された制約によって制限される。指定された理想的な寸法は、提案の中に対応する方向が未指定の場合、置き換える。

元のviewと外側の見えないframeという2つを考えるとわかりやすいですが、The size proposed to this view is the size proposed to the frameで、(ソースコード上で)このviewに対して親viewから提案されるものは、実際は(そのviewを囲む見えない)frameに対して提案されるという意味。limited by any constraints specifiedはmaxやminのこと。
次の文は with O C で、何も指定がない場合にidealが適用されると言っている。
O : any ideal dimensions specified
C : replacing any corresponding unspecified dimensions in the proposal

If no minimum or maximumの段落

If no minimum or maximum constraint is specified in a given dimension, the frame adopts the sizing behavior of its child in that dimension.

与えられた方向で最小も最大も制約が指定されていない場合、フレームはその子のサイズを採用します。

「If no A or B」は、「もしAもBもなければ」という意味らしい(そうじゃないと後の部分とも矛盾するのでその前提で行きます)。minimumもmaximumもないならそのview(ここではchildと言っている)のサイズを適用。

If both constraints are specified in a dimension, the frame unconditionally adopts the size proposed for it, clamped to the constraints.

1つの方向に両方の制約が指定されている場合、フレームは無条件に(親から)提案されたサイズを採用するが(min maxの)制約には制限される。

「minあり and maxあり」のときは

  • min
  • max
  • frameに渡された値、つまりframeの外側からの値

の3つによって決まります。frameに渡された値が第一希望ですが、min maxの範囲を外れている場合はminかmaxの外れた側が採用されます

unconditionally (無条件に)はこのviewのサイズが関係なくなることを表現しているのではないかと思います。

Otherwise,

Otherwiseは、残っているもの、つまり片方だけ(minだけ or maxだけ)指定された場合です。

the size of the frame in either dimension is:

either はいずれかという意味だが、ここでは当然minだけ or maxだけ指定された方向。isで終わっているが、isに続くものがこの後に場合分けされて書かれる。

If a minimum constraint is specified and the size proposed for the frame by the parent is less than the size of this view, the proposed size, clamped to that minimum.

minimumが指定されているが、親viewから提案された値がこのviewより小さいとき、提案されたサイズがminimumの制約を適用された上で採用される。

次の3パターンです。採用されるのを()で囲んでます。

min < (親) < このview
親 < (min) < このview
親 < このview < (min)

the proposed sizeの部分はthe size of the frame in either dimension isからつながっています。the proposed sizeが核でclamped to that minimumが付け足しの説明。

If a maximum constraint is specified and the size proposed for the frame by the parent is greater than the size of this view, the proposed size, clamped to that maximum.

maximumが指定されているが、親viewからの値がこのviewより小さいとき

次の3パターンです。採用されるのを()で囲んでます。

(max) < このview < 親
このview < (max) < 親
このview < (親) < max

先ほどと同様に、the proposed sizeが核でclamped to that maximumが付け足しの説明。

Otherwise, the size of this view.

残りはこのviewのサイズが採用される。

残りというのは

  • minだけ指定、かつ、このview < 親
  • maxだけ指定、かつ、親 < このview

です。ここではイコールは省く(法則を把握してからイコールを考えたほうが説明がシンプルになる)。
このviewのサイズが採用されると書いているが、ここには間違い(と思われるもの)があって、実験すると以下のようになる。

min < (このview) < 親
このview < (min) < 親
このview < 親 < (min)

(max) < 親 < このview
(親) < max < このview
(親) < このview < max

ちょっとAppleに報告済みでござる。

min maxの検証は次の記事で細かくやってます。

https://zenn.dev/samekard_dev/articles/7f6991a19a62f8

Discussion