0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

iOS15でUIStackView内のオブジェクトにAutoLayout設定(Constraints)があるとそれが原因で表示が崩れることがある件

Last updated at Posted at 2021-12-17

結論

iOS15 からオートレイアウトのConstraintsにあるPriority設定が 正しく 効くようになったので、iOS14以前に作ったアプリでConstraintsのPriority値を意識した実装をしていないと何らかの画面崩れが発生する可能性があり対処が必要になります。
(iOS15のRelease Notesにはない挙動の変更のようです。そして、iOS15だけでなくiOS14でも同様の仕様変更がされているようです)

気づいた経緯

iOS15で発生した表示問題

扱っているiOS版アプリにて、UIStackViewで、説明表示を実装している部分がありました。
構成は以下のドキュメントアウトラインの通りにしていました。そして、iOS12版で表示すると下の画像の通り、細い棒線と文字を組み合わせた表示でした。オブジェクトの実装内容の内訳は、棒線はUIViewオブジェクトでConstraintsのheightを1にして、文字(UILabel)の両脇に表示していました。文字にConstraints設定はありません。
iOS15では、添付の画像の通り、UIViewのConstraintsに引っ張られてUILabelの表示もheightに1になって表示されました。

  • <変更前のドキュメントアウトライン>
    before.png
  • <iOS12での表示>
    rapture_20211217111318.png
  • <iOS14,15での表示>
    rapture_20211217112559.png

iOS15でとりあえず表示されるように暫定対応した

調査した結果、Priority設定周りの仕様変更がiOS15リリース前までは正しく効いてなかったのが、iOS15から効くようになったことが原因とわかりました(同時にiOS14にも反映されています)。
変更は、以下のアウトラインには表示されていないのですが、UIViewのConstraintsのPriorityを999にして、UILabelのPriorityを1000でheightを設定しています。
参考にした後述のサイト曰く、Constraintsのpriority仕様変更はNew Featureとして掲載されていない件だということです。

  • <優先度と説明のConstraints変更後のドキュメントアウトライン>
    after.png
  • <iOS15での表示>
    rapture_20211217112724.png

腑に落ちない点

Priority設定が効くようになったというのはわかりますが、それ以上に挙動が不思議な点があります。上記の例でUIStackViewエリア内に横並びのオブジェクトがあって、それらの一番左のConstraints設定が右に並んでいる全てのオブジェクトに効いてしまう点です。左端のオブジェクトのPriority設定を999にして、真ん中を1000にすると真ん中のConstraints設定が優先されます。

ハマった際にはご注意ください。

参考にした情報ページ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?