iOSの「写真」アプリみたいなギャラリーを作る
iPhoneの「写真」アプリってデフォルトだけあってギャラリーアプリとしては快適な動きをします。
これを自作するとなると意外にもいいライブラリも見つからず、また、これだ!と思うコードも見つからなかったので自作してみたという話です。
コードは以下
基本はUIScrollViewを使う
ギャラリーの動きはUIScrollViewで再現できます。表示したい写真をUIScrollViewを下地に、水平方向に並べてaddView
させます。ただし、標準だと写真と写真の境目で止まらないので、pagingEnabled
を YES
にしてページ送りの動きにします。
表示したい写真の前後だけaddViewする
仮に10枚の写真を表示したければ10枚分addView
すればいいでしょうが、これが何百、何千になったらメモリが足りなくなったり重くなったりするでしょう。なので、最初に表示するべき写真とその前後の写真3枚のみをaddView
し、スクロールが完了したタイミングで前のaddView画像を破棄し、新たに3枚の写真をaddView
するという仕組みにしました。
スクロールを「進めた」か「戻った」かの判定がシビア
この処理は、スクロールが完了した時に呼ばれるメソッドscrollViewDidEndDecelerating
内で行っていますが、スクロールを開始して指を離して自然と止まる(ページ送りが完了する)前に指で止めても呼び出されるため、自然と止まったか、そうでないかの判定をしておかないと、表示されるべき画像がおかしくなります。
試行錯誤したあげく、結局はscrollViewWillBeginDecelerating
という指を離したタイミングで呼ばれる関数内で一旦スクロールを不許可にして止めれないようにして、scrollViewDidEndDecelerating
で元に戻すという処理にしました。
おわりに
以上でギャラリーっぽいアプリにはなりましたが、scrollViewWillBeginDecelerating
でスクロール禁止しているだけあって、高速で移動することができません。他にもサムネイルを画面下部に表示させた上で、サムネイル直接選択で画像にジャンプするとかいう機能もつけてみたいところではあります。というか、もっと探せば便利なライブラリがありそう、、