engineers_blogiOSエンジニアの西方です。SEが発売されました。Plusシリーズが好きなので、今さら4インチに興味はなかったのですが、片手に収まるこのサイズに魅力を感じている方も少なくないでしょう。開発者としては複雑な気分です。4インチユーザーが減ってくるかなと願っていた矢先の4インチデバイス再来。4インチのサポートを切ることはできませんね。Layoutなしで画面実装を進めることは難しいでしょう。Layoutの中でも少し特殊な「固有サイズの優先度」について、その意味と使い方を説明します。Layoutでビューのサイズを指定するためには、幅や高さに関する制約を利用します。コンテンツに合わせてビューのサイズを動的に変化させたいケースもあります。このとき使うのが固有サイズです。固有サイズとは「固有サイズ」とは、ビューのコンテンツにマッチしたサイズのことです。Size」と表記されています。Forward』であるラベルとでは、前者の固有サイズの方が小さくなります。下図は、Storyboard上でそれぞれのラベルを固有サイズで表示した様子です。システムは、サイズに関する制約が設定されていないビューがあると、固有サイズを元にレイアウトします。ビューの配置に関する制約を設定するここからは実際に、画面上に配置した2つのUILabelに制約を設定しながら解説します。設定するのは、次の4つの制約です。位置を親ビューの中央に揃えるこの状態で、Xcodeのプレビュー表示を使い各デバイスでのレイアウトを見てみます。この状態では問題はありません。Forward』と設定してみます。制約に関するエラーが発生した上に、4インチ上からはForwardラベルが消えてしまいます。Priority」という2種類の優先度を制御するようにアドバイスが出ています。固有サイズを含めた制約全体に不整合が生じ、ビューが正しくレイアウトできない状態です。各ラベルの矩形をコンテンツに合わせようとすると、ラベルが親ビューからはみ出してしまい、他の制約を満たすことができません。このままでは、システムがビューのレイアウトを決定することができません。そこで必要となってくるのが、固有サイズの優先度です。固有サイズと他の制約とが競合したときに、どの値を優先するか指定しなくてはなりません。そのために用いるのが固有サイズの優先度です。固有サイズには次の2通りの優先度があります。Priority余白のできにくさコンテンツが小さすぎるときに、ビューの矩形を狭めて余白を作らないようにする優先度が高ければ高いほど、システムは、ビューの矩形をコンテンツのサイズに近づけようとします。実際に優先度を設定してみます。いま問題になっているのは、コンテンツが大きすぎることです。右側のラベル表示の優先度を高くしましょう(右側のラベルでコンテンツがつぶれないようにする)。Priorityを751に変更します。Inspectorで行います(下図)。プレビューで確認すると、今度は左側のラベルが完全に押しつぶされて、非表示になってしまいます。これでは困るので、左側のラベルには最低幅を設定します。幅が65以上となるように制約を追加しましょう(下図)。一度プレビューで確認すると、どのデバイスでも意図通り表示されています。次に、左側のラベルを『M』右側のラベルを『F』に書き替えてみましょう。優先度に関するエラーが表示されてしまいます。Priorityです。左側のラベルには極力余白ができないようにしましょう(右側のラベルには余白を許容する)。Priorityを252に変更します。ここで注意したいのが、左側のラベルにはすでに、幅が65以上になるように制約が設定されていることです。Priorityより大きいため、「幅65以上」という制約が最優先されます。これで、コンテンツサイズに依らず制約の不整合が発生しなくなりました。Forward』、右側のラベルに『お金を前へ。』と設定すると、次のように表示されます。Layoutでは、複数のビューに固有サイズを適用すると、コンテンツのサイズによってはレイアウトが一意に決まりません。この問題を解決するために用意されているのが、固有サイズの優先度です。固有サイズの優先度と、幅または高さに関する制約の優先度をうまく制御することで、希望通りのレイアウトが実現できます。幅や高さの制約には、固定値だけでなく最大値または最小値を設定してみるのもよいでしょう。ラベルに表示する内容が動的に変化するケースでは、十分に注意して実装とテストを行わないと、ユーザーの環境で予期せぬことが起きているかもしれません。Layoutを賢く使って、デバイスサイズやコンテンツの変化にも強いレイアウトを実現したいものです。最後にマネーフォワードでは、デバイスサイズの多様化に負けない強い心を持ったアプリエンジニアを募集しています。ご応募お待ちしています。