gpt4 book ai didi

c# - UIPageViewController 的 DidFinishAnimating 和 WillTransition,如何正确实现这些方法?

转载 作者:行者123 更新时间:2023-11-29 00:18:50 25 4
gpt4 key购买 nike

我的 UIPageViewControllerDelegate 方法有问题。当用户向一个方向滑动时,它无法正确跟踪页面,无法完成滑动并滑动回第一页。

例如

  1. 我在第 1 页,我从右向左滑动
  2. 当我滑动时,我看到了第 2 页。但是,在“第 1 页到第 2 页”转换完成之前,我停止朝该方向滑动并从左向右滑动(无需抬起手指)。
  3. 现在我在第 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com