【XamarinによるiOS超入門 】 ページコントロール ( UIPageControl )
【 Xamarin 記事一覧 】 【XamarinによるiOS超入門 】
1 コントロールの配置

ページコントロール(UIPageControl)は、複数ページの中で現在位置を表現するコントロールです。コントロールをタップしてページを移動させる実装も可能です。
ページコントロールはサイズが固定なので、画面に表示できるドット数(ページ数)には限界があります。(iPhone5を縦にした場合、20ページが限界でした)
このコントロールを配置する基本的なコードは次のとおりです。
View.Boundsで画面のサイズを取得し、画面の一番下に高さ50で配置しました。
また、白バックだとデフォルトのドットが見えないので、見やすいようにバックを黒色にしました。
public override void ViewDidLoad() { base.ViewDidLoad(); //ページ数 const int pageSize=5; //ページコントロールのサイズ(高さ) const int height = 50; // ページコントロールの生成 var pageControl = new UIPageControl{ Frame = new RectangleF(0, (float)View.Bounds.Height - height, (float)View.Bounds.Width, height),//画面の一番下に高さでheightで表示する BackgroundColor = UIColor.Black,//デフォルトのインジケータの色が見えやすいように背景色を黒にする Pages = pageSize, }; //ビューに追加 Add(pageControl); }
2 総ページ数・現在のページ
ページの総数は、Pagesプロパティで指定します。また、現在のページはCurrentPageプロパティに設定します。なお、CurrentPageは、「0」が1ページ目です。
(最終ページを超える数値を現在ページに設定すると、最後のページになり、0以下を設定した場合0になります)
pageControl.Pages = 10;//全部で10ページ pageControl.CurrentPage = 3;//現在のページは4ページ
ストーリーボードを使用している場合は、「# of Pages」及び「Current」を使用します。
ページ総数が1ページの場合に、デフォルトでは1ドットが表示されますが、HidesForSinglePageでこれを非表示にできます。
pageControl.HidesForSinglePage = false;//ページ数が1ページの場合、非表示とする
DefersCurrentPageDisplayをtrueにすると、UpdateCurrentPageDisplayメソッドを呼び出すまで、コントロールの表示更新を遅延させることができます。
これは、ページ更新の処理が重い場合などに、コントロールの表示をマッチさせるために使用されます。
動作は、概ね次のとおりです。
- (1)ユーザーによるコントロールのタッチ
- (2)ValueChangedイベントの発生
- (3)UpdateCurrentPageDisplayの呼び出し
- (4)ページコントロールの表示更新
pageControl.DefersCurrentPageDisplay = true;//更新の遅延 //ページコントロールが変化した時のイベント pageControl.ValueChanged += (s, a) => { //ページ更新の処理 //・・・・ pageControl.UpdateCurrentPageDisplay();//(3)ページコントロールの表示更新 };
ストーリーボードを使用している場合は、下記のチェックを使用します。
3 外観(色合い)
ドットの色は、デフォルトでは、現在ページ白、その他はグレーの半透明になっていますが、これは変更が可能です。
pageControl.CurrentPageIndicatorTintColor = UIColor.Yellow;//現在ページ pageControl.PageIndicatorTintColor = UIColor.Red;//その他のページ
4 イベント
ページコントロールのタップで実際にページを変化させるためには、そのイベントを処理しなければなりません。また、ページ自体がスライド等で変更された場合、そのイベントでページコントロールの表示を更新する必要があります。
ここでは、スクロールビューと連携したコードを紹介します。
ここでのスクロールビューは、横に5ページとなっています。
ページコントロールをタッブしても、スクロールビューをスライドしても、どちらでもページが変更されます。
public override void ViewDidLoad() { base.ViewDidLoad(); //ページ数 const int pageSize = 5; //スクロールビューの生成 var scrollView = CreateScrollView(pageSize); Add(scrollView);//スクロールビューの追加 // ページコントロールの生成 var pageControl = new UIPageControl{ Frame = new RectangleF(0, (float)View.Bounds.Height - 50, (float)View.Bounds.Width, 50),//画面の一番下に高さで50で表示する BackgroundColor = UIColor.Black,//デフォルトのインジケータの色が見えやすいように背景色を黒にする Pages = pageSize, }; Add(pageControl);//ページコントロールの追加 //ページコントロールが変化した時のイベント pageControl.ValueChanged += (s, a) => { var page = pageControl.CurrentPage;//変化後のページ //スクロールビューのオフセットを変更する scrollView.ContentOffset = new PointF((float)View.Bounds.Width * page, 0);//スクロールビューに反映させる }; //スクロールビューが変化した時のイベント scrollView.DecelerationEnded += (s, a) => { var page = scrollView.ContentOffset.X / View.Bounds.Width;//変化後のページ pageControl.CurrentPage = (nint)page;//ページコントロールに反映させる }; } //スクロールビューの生成 UIScrollView CreateScrollView(int pageSize) { //ビューの縦横のサイズ var w = (float)View.Bounds.Width; var h = (float)View.Bounds.Height; //スクロールビューの生成 var scrollView = new UIScrollView(View.Bounds) { PagingEnabled = true,//ページ単位のスクロール ContentSize = new SizeF(w * pageSize, h)// 現在のページを基準に、縦1倍、横5倍 }; // スクロールビューの各ページの中央にページ数を表示する for (var i = 0; i < pageSize; i++) { var label = new UILabel(new RectangleF(0, 0, 100, 30)) { Text = "PAGE" + i, Center = new PointF(w / 2 + w * i, h / 2), TextAlignment = UITextAlignment.Center, }; scrollView.Add(label); //スクロールビューに追加 } return scrollView; }
5 参考にさせて頂いたページ
UIKit User Interface Catalog: Page Controls
iOS 7 から始める UIKit 入門 コントロール編 #4 Page Control | Developers.IO
iOSヒューマンインターフェイスガイドライン: コントロール部品