🕳️

UIPageControlは、インジケータではない。

2023/01/02に公開

UIKitには、ページ数と現在のページをドットで表示するUIPageControlというものがあります。
有名なところでは、iPhoneのホーム画面の下部で使われています。

https://developer.apple.com/documentation/uikit/uipagecontrol

ところで、ただページの情報を表示するだけであればUIActivityIndicatorよろしくUIPageIndicatorのような名前で良いはずです。なぜUIPageControlという名前なのでしょうか?

その理由を探るためにクラスの宣言を見てみると、UIPageControlはUIControlを継承したサブクラスであることが分かります。

UIControlはユーザーの操作(コントロール)を受け付ける処理を持つクラスで、UIPageControlをはじめ、UIButtonやUISliderなどが継承しています。

つまり、UIPageControlもユーザーによる操作を直接受け付けるクラスであるということです。
では、UIPageControlが受け付ける操作とはなんでしょうか。

1つは、UIPageControlをスクラブ(掴んで左右に引っ張ること)で高速スクロールする操作です。

2つ目は、UIPageControlの左右の余白をタップすることでページ送りをする操作です。

このように、UIPageControlは現在のページ位置を表示するだけでなくページ送りの操作をするためのコントロールであることがわかります。
特にカルーセルコンテンツと合わせて使う場合は、カルーセルコンテンツのスクロールに合わせてUIPageControlを更新するだけでなくUIPageControlの操作によってカルーセル側をスクロールさせる双方向の同期処理が必要になります。

また、UIPageControlは見た目の高さが9px程度なのですが操作を受け付けるという観点から26~44px程度の高さを確保すると良いでしょう。
幅に関しても、左右のタップエリアを確保するように余白を持ったサイズにすると良いでしょう。
そして、iOSの世界ではこの挙動が正式な挙動といえます。操作を無効化するのはアクセシビリティを下げる要因にもなるのでやめましょう。

その他のルールに関してはHIGが参考になります。
https://developer.apple.com/design/human-interface-guidelines/components/presentation/page-controls/

Discussion