2017-06-14 49 views
0

我遇到了与我的UIPageViewControllerDelegate方法有关的问题。当用户向一个方向滑动时,它不会正确跟踪页面,不会完成该滑动并滑动回第一页。DidFinishAnimating和WillTransition for UIPageViewController,我该如何正确实现这些方法?

Ex。

  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) 

,并有完全相同的问题。

所以我在这两种方法中有什么不对,有什么建议吗?

回答

1

使用UIPageViewController时,不需要实现这些方法在页面(ViewControllers)之间导航。

您应该落实在UIPageViewControllerIUIPageViewControllerDataSource界面右侧并设置数据源为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); 
    } 
} 

希望这有助于!

+0

这绝对有帮助,谢谢!但是现在我遇到了这个问题。我需要能够确切了解刷卡何时发生并完成,以便能够更新新可见控制器周围的数据。在这种情况下,每个控制器都包含一些媒体,这些媒体可以有与该媒体关联的评论所以我需要能够在传呼机内看到一个新的控制器时更新评论列表。在这个实现中,GetNext/PreviousViewController方法以非常难以知道何时完成过渡与何时过渡的方式启动... – kformeck

+0

开始然后取消(通过在一个方向上中途向后滑动然后返回再次)。 – kformeck

+0

我试图解决的问题是,当用户执行半挥动(转换被取消,即在DidFinishAnimating,finished = true,completed = false)时,注释并不总是与可见媒体正确对齐 – kformeck