UICollectionView で表示された写真一覧をモーダル表示して、選択した写真をサクッとクリップする機能を作りたかったのですが、iOS13 から実装された下スワイプで閉じる機能とオリジナルのジェスチャーが競合して、まともに操作できないようにな状態になりまして。
写真を拡大縮小すると、めっちゃ揺れるんすよ。笑
フルスクリーンにせぇや!って人もいると思いますが、そんな輩はスルーして、一部の画面だけ下スワイプをオフにする方法をメモしときます。
前提条件
・Xcode12
・Swift5
・写真一覧画面を画面A、選択した写真をクリップする画面を画面Bとします。
やりたいこと
1)画面Aは modalPresentationStyle = .automatic のままで表示
2)画面Bは画面Aからプッシュして表示
3)画面Aは下スワイプが効くが、画面Bは下スワイプが効かないようにしたい
特殊なパターンかもしれませんが、画面Bは UIImageView を移動したり拡大縮小してクリップする画面のため UIPanGestureRecognizer を使っており、下スワイプと競合しないようにする必要がありました。
UIImageView の位置によってそのままヌルッと閉じる処理に入るのが個人的には理想ですが、全然メイン機能ではなかったので、手っ取り早く提供できる「下スワイプをオフにする」という選択をしました。
あと、画面Aは様々な場所から呼ばれるのですが、一部の画面から呼ばれたときだけ「フルスクリーン表示にする」ことは避けたかったです。
解決方法
Apple さんがちゃんと用意してくれてました。
1 2 3 |
let vc = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateInitialViewController() vc.isModalInPresentation = true // これ!! self.present(vc, animated: true, completion: nil) |
これだけで下スワイプが使えなくなり、ガガッと画面が止まるようになります。
今のところ Storyboard だけでオフにするようなことは出来ないので、その場合はフルスクリーンを選択するしかないかと思われます。
さいごに
本当は UIImageView のY軸が負になったら下スワイプで閉じる、みたいにヌルッと動かしたいです。笑
時間が空いたら修正していこうと思います (`・ω・´)
コメント