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

标签 c# ios iphone xamarin uipageviewcontroller

我的 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/

相关文章:

c# - 在隐式转换中使用字符串常量

ios - 如何为 UITextView 设置自动布局约束

iphone - 如何更改 UIBarButtonItem 图像大小

android - 小型设备上的换行符 - iPhone/Android

c# - 从 TextPointer 检索 CharOffset

c# - 将通用代码从 C# 转换为模板 C++

c# - 如何构建成员表达式的成员表达式?

ios - 替换 NSPredicate 中字符串中的内容

iphone - UITableViewCell 内的水平 UIScrollView

iphone - 使用 Apple 代码签名为 Cydia 构建应用程序