UIPageViewController 的 DidFinishAnimating 和 WillTransition,如何正确实现这些方法?
DidFinishAnimating and WillTransition for UIPageViewController, how do I properly implement these methods?
我的 UIPageViewControllerDelegate 方法有问题。当用户向一个方向滑动时,它不会正确跟踪页面,不会完成滑动并滑动回第一页。
例如
- 我在第 1 页,我从右向左滑动
- 滑动时,我看到了第 2 页。但是,在 'page 1 to page 2' 过渡完成之前,我停止朝那个方向滑动并从左向右滑动(没有抬起手指)。
- 现在我在第 1 页,但我看到的所有内容都与第 2 页一致。
以下是我如何实现这些方法:
public Action<int> PageSwiped { get; set; }
public override void WillTransition(
UIPageViewController pageViewController, UIViewController[] pendingViewControllers)
{
_currentController = pendingViewControllers[0] as AssetViewController;
}
public override void DidFinishAnimating(
UIPageViewController pageViewController, bool finished,
UIViewController[] previousViewControllers, bool completed)
{
if (completed)
{
PageSwiped(_currentController.CurrentMedia.Content.ProofIndex);
}
}
触发 'PageSwiped' 操作以允许其他 类 知道页面已被滑动。
我试过更换:
if (completed)
和
if (finished)
并且遇到了完全相同的问题。
所以我在这两种方法中一定有什么地方做错了,有什么建议吗?
使用 UIPageViewController
时,您无需实现这些方法即可在页面之间导航 (ViewControllers)。
您应该在 UIPageViewController
中实现 IUIPageViewControllerDataSource
接口并将数据源设置为 this
或子类 UIPageViewControllerDataSource
并将数据源设置为创建的对象。
无论哪种情况你都会implementing/overriding这两种方法
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
这些是 return 将要显示的页面 (UIViewController) 的方法。
在这里,您只需查找当前屏幕上控件的索引,然后获取下一个或上一个以及 return 集合中的那个项目。
获取下一个ViewController:
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var nextIndex = index + 1;
return MyViewControllers.ElementAtOrDefault(nextIndex);
}
获取前一个ViewController:
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var previousIndex = index - 1;
return MyViewControllers.ElementAtOrDefault(previousIndex);
}
区别在于这些方法仅在转换成功完成时调用。
完整代码如下:
public partial class MyPageViewController : UIPageViewController, IUIPageViewControllerDataSource
{
List<UIViewController> MyViewControllers = new List<UIViewController>();
public MyPageViewController (IntPtr handle) : base (handle)
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
var redViewController = UIStoryboard.FromName("Main", null).InstantiateViewController("redViewController");
var greenViewController = UIStoryboard.FromName("Main", null).InstantiateViewController("greenViewController");
var blueViewController = UIStoryboard.FromName("Main", null).InstantiateViewController("blueViewController");
MyViewControllers.Add(redViewController);
MyViewControllers.Add(greenViewController);
MyViewControllers.Add(blueViewController);
DataSource = this;
SetViewControllers(new UIViewController[] { MyViewControllers.First() }, UIPageViewControllerNavigationDirection.Forward, true, null);
}
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
}
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var nextIndex = index + 1;
return MyViewControllers.ElementAtOrDefault(nextIndex);
}
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var previousIndex = index - 1;
return MyViewControllers.ElementAtOrDefault(previousIndex);
}
}
希望对您有所帮助!
我的 UIPageViewControllerDelegate 方法有问题。当用户向一个方向滑动时,它不会正确跟踪页面,不会完成滑动并滑动回第一页。
例如
- 我在第 1 页,我从右向左滑动
- 滑动时,我看到了第 2 页。但是,在 'page 1 to page 2' 过渡完成之前,我停止朝那个方向滑动并从左向右滑动(没有抬起手指)。
- 现在我在第 1 页,但我看到的所有内容都与第 2 页一致。
以下是我如何实现这些方法:
public Action<int> PageSwiped { get; set; }
public override void WillTransition(
UIPageViewController pageViewController, UIViewController[] pendingViewControllers)
{
_currentController = pendingViewControllers[0] as AssetViewController;
}
public override void DidFinishAnimating(
UIPageViewController pageViewController, bool finished,
UIViewController[] previousViewControllers, bool completed)
{
if (completed)
{
PageSwiped(_currentController.CurrentMedia.Content.ProofIndex);
}
}
触发 'PageSwiped' 操作以允许其他 类 知道页面已被滑动。
我试过更换:
if (completed)
和
if (finished)
并且遇到了完全相同的问题。
所以我在这两种方法中一定有什么地方做错了,有什么建议吗?
使用 UIPageViewController
时,您无需实现这些方法即可在页面之间导航 (ViewControllers)。
您应该在 UIPageViewController
中实现 IUIPageViewControllerDataSource
接口并将数据源设置为 this
或子类 UIPageViewControllerDataSource
并将数据源设置为创建的对象。
无论哪种情况你都会implementing/overriding这两种方法
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
这些是 return 将要显示的页面 (UIViewController) 的方法。
在这里,您只需查找当前屏幕上控件的索引,然后获取下一个或上一个以及 return 集合中的那个项目。
获取下一个ViewController:
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var nextIndex = index + 1;
return MyViewControllers.ElementAtOrDefault(nextIndex);
}
获取前一个ViewController:
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var previousIndex = index - 1;
return MyViewControllers.ElementAtOrDefault(previousIndex);
}
区别在于这些方法仅在转换成功完成时调用。
完整代码如下:
public partial class MyPageViewController : UIPageViewController, IUIPageViewControllerDataSource
{
List<UIViewController> MyViewControllers = new List<UIViewController>();
public MyPageViewController (IntPtr handle) : base (handle)
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
var redViewController = UIStoryboard.FromName("Main", null).InstantiateViewController("redViewController");
var greenViewController = UIStoryboard.FromName("Main", null).InstantiateViewController("greenViewController");
var blueViewController = UIStoryboard.FromName("Main", null).InstantiateViewController("blueViewController");
MyViewControllers.Add(redViewController);
MyViewControllers.Add(greenViewController);
MyViewControllers.Add(blueViewController);
DataSource = this;
SetViewControllers(new UIViewController[] { MyViewControllers.First() }, UIPageViewControllerNavigationDirection.Forward, true, null);
}
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
}
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var nextIndex = index + 1;
return MyViewControllers.ElementAtOrDefault(nextIndex);
}
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var previousIndex = index - 1;
return MyViewControllers.ElementAtOrDefault(previousIndex);
}
}
希望对您有所帮助!