我的 UIPageViewControllerDelegate 方法有问题。当用户向一个方向滑动时,它无法正确跟踪页面,无法完成滑动并滑动回第一页。
例如
- 我在第 1 页,我从右向左滑动
- 当我滑动时,我看到了第 2 页。但是,在“第 1 页到第 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
时,您无需实现这些方法即可在页面 (ViewController) 之间导航。
您应该在 UIPageViewController
中实现 IUIPageViewControllerDataSource
接口(interface),并将您的数据源设置为 this
或子类 UIPageViewControllerDataSource
并将数据源设置为创建的对象。
无论哪种情况,您都将实现/覆盖这两个方法
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
这些是返回将要显示的页面 (UIViewController) 的方法。
在这里,您只需找到当前屏幕上控件的索引,然后获取下一个或上一个,然后从集合中返回该项目。
获取下一个 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);
}
}
希望这对您有所帮助!
关于c# - UIPageViewController 的 DidFinishAnimating 和 WillTransition,如何正确实现这些方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44552839/