半モーダルのような表示4選(Swift)

botman_blue iOS

Xcode-13.0 Swift-5.5 iOS-15.0

はじめに

iOS 15 からついに標準で半モーダルが実装できるようになりました!

そもそも半モーダルてなんなんだ?という気持ちですが下記記事より抜粋。
iOSでの半モーダル/ハーフモーダルの実装についてのまとめ

・モードの完全遷移が起こらない

・モードを多重化しながらパラレルに対話可能

・モードを終了させずにモードからの一時退避が可能

・擬似的なマルチウインドウ・インターフェイスに応用可能

・スワイプなどインタラクションコストの低い操作方法によってモードの切り替えが可能

ということで半モーダルぽいものの実装方法について4つ紹介します。
こんな感じです。

sheetPresentationControllerを使う

iOS 15 から使えるようになった sheetPresentationController を使う方法です。

red

実装方法は ViewController の sheetPresentationController.detents に設定してやるだけ。

UIModalPresentationStylepageSheetformSheet である必要があるみたいです。

使えるならこれが一番いいように思います。残念ながら iOS 15 以上でしか使えないので iOS 14 などもターゲットであれば他の方法を模索する必要があります。

inputViewを使う

半モーダルと言えるのか?とも思いますが inputView を使った方法です(入力モードと考えるなら半モーダルなのかも??)。

green

実装方法は下記。CustomKeyboardView は xib で作ってます。任意の画面のボタンのクラスに SelectButton を設定するとボタン押下で表示されます。

OS のバージョンを気にする必要はありませんが inputView のカスタマイズなので使える場面は限られるかもしれません(あとセーフエリア対応とかめんどくさい)。

作ってから思いましたが inputView の上に UISearchBar のっけてもキーボード表示できないので使えないですね。。。

UIActivityViewControllerの魔改造

下記でみかけた UIActivityViewController を魔改造する方法です。
Recreate iOS 13' share sheet modal in swift (not the share sheet itself, but the way it's presented)

blue

実装方法は下記。

こちらも iOS 15 未満でも動きますが OS のバージョンアップで動かなくなる可能性もあるのでおすすめはしません(面白そうだったので取り上げました)。

ライブラリ(FloatingPanel)を使う

SCENEE/FloatingPanelを使う方法です。今までだとこちらの方法が半モーダル実装のスタンダードだったのではないでしょうか。

yellow

実装方法(SPM でいれました)。

FloatingPanelLayout を設定することで高さ調整もできます。

Swift Package Manager にも対応していますし最近もメンテされているようなので iOS 15 以降でも利用できそうです。

おわりに

そういえば公式で半モーダルができるようになったなぁというのを思い出しました。似たようなことなら他にも色々方法がありそうだなということで4つ提案してみました。

公式が使えるなら公式が一番!

参考

コメント

タイトルとURLをコピーしました