酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Xamarin.iOSでUIPageViewControllerを使う

電子書籍的なページめくりやフリックでの画面遷移などに使うUIPageViewControllerクラスがあります。

public partial class HogeViewController : UIPageViewController
{
    public HogeViewController(IntPtr handle) : base(handle)
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        
        var dataSource = new HogeDataSource();
        DataSource = dataSource;

        SetViewControllers(new []{ model.Pages.ElementAt(0) },
            UIPageViewControllerNavigationDirection.Forward, true, null);
    }

    public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);
    }
}

HogeDataSourceクラスは、UIPageViewControllerDataSourceを継承して、下記のように定義しておきます。

public class HogeDataSource : UIPageViewControllerDataSource
{
    public List<UIViewController> Pages = new List<UIViewController>(); 

    public HogeDataSource()
    {
        var redVC = new UIViewController();
        redVC.View.BackgroundColor = UIColor.Red;
        Pages.Add(redVC);

        var blueVC = new UIViewController();
        blueVC.View.BackgroundColor = UIColor.Blue;
        Pages.Add(blueVC);

        var yellowVC = new UIViewController();
        yellowVC.View.BackgroundColor = UIColor.Yellow;
        Pages.Add(yellowVC);
    }

    public override UIViewController GetPreviousViewController(
        UIPageViewController pageViewController, UIViewController referenceViewController)
    {
        var index = Pages.IndexOf(referenceViewController) - 1;
        if (index <= 0)
        {
            index = (Pages.Count - 1);
        }

        return Pages.ElementAt(index);
    }

    public override UIViewController GetNextViewController(
        UIPageViewController pageViewController, UIViewController referenceViewController)
    {
        var index = Pages.IndexOf(referenceViewController) + 1;
        if (index >= Pages.Count)
        {
            index = 0;
        }

        return Pages.ElementAt(index);
    }

    public override nint GetPresentationCount(UIPageViewController pageViewController)
    {
        return Pages.Count;
    }

    public override nint GetPresentationIndex(UIPageViewController pageViewController)
    {
        return 0;
    }
}

f:id:ch3cooh393:20150325195217p:plain

ページインジゲータを非表示にする

画面下部にページインジゲータとしてPageControlが表示されていますが、これを消すにはGetPresentationCountメソッドGetPresentationIndexメソッドをオーバーライドするのをやめます。

関連記事

Xamarin.iOSを使ってアプリ開発する際に逆引きとしてお使いください。