iOS15 で UISearchController を利用する時の注意点
UISearchController でコンテンツを隠すとは
iOSアプリで UISearchController を利用している場合、検索中に基になるコンテンツを隠すかどうか変更できます。
このように検索中に下の TableView の Cell をタップできない状態を基になるコンテンツを隠すと表現しています。グレーでマスクされている部分をタップすると Cancel をタップした時と同じように検索中を解除します。
隠したい場合 iOS14まではデフォルトで隠す設定だったので、特に意識しないで済みました。
これが iOS15からデフォルトで隠さない設定に変わってしまったため、隠したい場合は明示的に隠す設定にする必要があります。
iOS15から検索中グレーでマスクされなくなります。そのため、検索中に下の TableView の Cell をタップできる状態になっています。
コンテンツを隠す property
iOS13から
obscuresBackgroundDuringPresentation
iOS12まで
dimsBackgroundDuringPresentation
デフォルト値
- iOS14までは
true
- iOS15からは
false
コンテンツを隠したい
よって、iOS15以降で検索中に基になるコンテンツを隠したい場合
searchController.obscuresBackgroundDuringPresentation = true
iOS15未満で隠したい場合は明示する必要はないです。
コンテンツを隠したくない
逆に iOS15未満で検索中に基になるコンテンツを隠したくない場合
searchController.obscuresBackgroundDuringPresentation = false
さらに iOS13 未満もサポートする場合は
if #available(iOS 13.0, *) {
searchController.obscuresBackgroundDuringPresentation = false
} else {
searchController.dimsBackgroundDuringPresentation = false
}
iOS15以降で隠さない場合、明示する必要はないです。
同時に設定すると?
Warning が表示されますが、 Deprecated なので、まだどちらの property も使用可能です。
これを同時に利用するとどうなるかというと、現時点では、 dimsBackgroundDuringPresentation
の設定が優先されます。
以下のコードでは、コンテンツは隠されないです。
searchController.obscuresBackgroundDuringPresentation = true
searchController.dimsBackgroundDuringPresentation = false
以下のコードでは、コンテンツは隠されます。
searchController.obscuresBackgroundDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = true
いずれも推奨される書き方ではないですが、既存のコードで意図しない挙動をしていたら注目すべき点です。
検証リポジトリ
これを検証したソースコードのリポジトリです。
OS標準では
なお、OS標準のアドレス帳ではこのデフォルト値に従っていました。
つまり、
iOS14
iOS14までは検索中にアドレス帳のコンテンツをタップできませんでしたが、
iOS15
iOS15以降、検索中にアドレス帳のコンテンツをタップできるようになっています。
まとめ
ゆえに Apple の期待する UISearchController の利用方法としては、デフォルトの挙動に従うべきなのかもしれません。
Human Interface Guidelines - Search Bars からはどのような振る舞いを期待しているかは読み取れませんでしたので、リジェクト対象になるとは考えにくいです。
ただ、標準の動作に適合していく方が今後の OS のアップデートに追従していくのが容易になる可能性も感じました。
とはいえ、 OS ごとの挙動をアプリ内では統一したいという側面もあると思うので、その場合は、紹介した property を利用して制御することも可能になっています。
Discussion