Skip to content

Instantly share code, notes, and snippets.

@jzeferino
Created January 11, 2019 16:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jzeferino/d6b7aa4d446fe0fe990cf85f5374273e to your computer and use it in GitHub Desktop.
Save jzeferino/d6b7aa4d446fe0fe990cf85f5374273e to your computer and use it in GitHub Desktop.
ViewPager like ViewController
using System;
using UIKit;
using System.Collections.Generic;
using Foundation;
using System.Linq;
namespace CustomView
{
public class ViewPagerViewController<TData> : UIPageViewController, IUIPageViewControllerDelegate, IUIPageViewControllerDataSource
{
private readonly Dictionary<int, UIViewController> _viewControllers;
private IList<TData> _items { get; }
private readonly Func<TData, UIViewController> _viewControllerFactory;
private int _lastIndex;
public int Index { get; private set; }
public ViewPagerViewController(UIPageViewControllerNavigationOrientation orientation, IList<TData> items, Func<TData, UIViewController> viewControllerFactory) : base(UIPageViewControllerTransitionStyle.Scroll, orientation, UIPageViewControllerSpineLocation.None)
{
_items = items;
_viewControllerFactory = viewControllerFactory;
_viewControllers = new Dictionary<int, UIViewController>();
MoveToPage(Index);
Delegate = this;
DataSource = this;
View.TranslatesAutoresizingMaskIntoConstraints = false;
}
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = Index;
return index++ < _items.Count - 1 ? GetOrCreateViewController(index) : null;
}
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = Index;
return index-- > 0 ? GetOrCreateViewController(index) : null;
}
private UIViewController GetOrCreateViewController(int index)
{
if (!_viewControllers.TryGetValue(index, out UIViewController viewController))
{
_viewControllers.Add(index, viewController = _viewControllerFactory(_items[index]));
}
return viewController;
}
[Export("pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:")]
public new void DidFinishAnimating(UIPageViewController pageViewController, bool finished, UIViewController[] previousViewControllers, bool completed)
{
if (!completed)
{
return;
}
var currentViewController = ViewControllers.FirstOrDefault();
_lastIndex = Index = _viewControllers.FirstOrDefault(x => x.Value == currentViewController).Key;
}
public void MoveToPage(int index)
{
var viewcontroller = GetOrCreateViewController(index);
var animateDirection = index > _lastIndex ? UIPageViewControllerNavigationDirection.Forward : UIPageViewControllerNavigationDirection.Reverse;
SetViewControllers(new UIViewController[] { viewcontroller }, animateDirection, true, (bool finished) =>
{
Index = _lastIndex = index;
});
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment