環境
Xcode 10
Swift 4.2
iOS 12
現象
UIStackViewのArrangedSubViewをisHiddenで、表示したり非表示にしたりする場合に対象のSubViewにWidthかHeightのConstraintを設定しているとたまにおかしな表示になる。
下の図でいうと、
1. StackViewのAxisがHorizontalでピンクのViewにWidthのConstraintを設定
2. コード上でピンクのViewにたいしていsHidden=trueをする
3. ピンクのViewが消えることを想定しているが、たまに消えない ← よくわかってないのですが特定の条件が重なると起きます
原因
isHidden=trueにした際にピンクのViewの幅が0になるのですが、そのConstraintともともと設定していたWidth=150のConstraintが競合してしまうのが原因です。
どちらもPriorityが1000 なので、どちらが優先されるかはOSが勝手に決める(たしか)。
どうすりゃいいの
ピンクのViewにもともと設定しているWidth=150のConstraintのPriorityを750(High)とかにすればOKです。
750じゃなくてもいいんですが、1000以下で低すぎない値なら999とかでもたぶん大丈夫です。
焦ったPoint
ViewHierarchyを見たときには要素が消えているが、ビルドした画面には要素が表示されており焦りました。
logのwarningを見ていれば焦らなくても済んだのかもしれませんが、warningが出まくっていて見てなかったです。