UIPageViewController - 以编程方式更改页面在 iPhone 4s/5/5s 上不起作用

Posted

技术标签:

【中文标题】UIPageViewController - 以编程方式更改页面在 iPhone 4s/5/5s 上不起作用【英文标题】:UIPageViewController - Change page programmatically doesn't work on iPhone 4s/5/5s 【发布时间】:2016-05-23 13:16:00 【问题描述】:

我有一个适用于 iPad/iPhone 的应用程序,它可以完美地在所有 iPad/iPhone 上运行,并且适用于除 iPhone 4S、5 和 5s 之外的所有版本。

我有一个 UIPageViewController 与 WebViews 作为单元格。 我有另一个简单的 UICollectionView 用作页面选择器:它的功能是让用户跳转到所选的第 X 页。

我的代码非常简单:我将触摸到的单元格的索引传递给 UIPageViewController 以应用我的“slideToPage(index)”函数。

对于iPhone 4S/5/5S来说,动画完成后会瞬间回到旧页面,用户无法跳转页面,只能一次翻一页:

这是我的代码:

func slideToPage(index: Int, completion: (() -> Void)?) 
    let currentViewController = pageViewController?.viewControllers![0] as! WebViewViewController
    let count = dataSource.controllers.count
    let currentPageIndex = dataSource.controllers.indexOf(currentViewController)!

    guard index < count else  return 

    // Moving forward
    if index > currentPageIndex 
        if let vc: WebViewViewController = dataSource.controllers[index] 
            self.pageViewController!.setViewControllers([vc], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: 
                void in
                vc.loadContent()
            )
        
    
    // Moving backward
    else if index < currentPageIndex 
        if let vc: WebViewViewController = dataSource.controllers[index] 
            self.pageViewController!.setViewControllers([vc], direction: UIPageViewControllerNavigationDirection.Reverse, animated: true, completion: 
                void in
                vc.loadContent()
            )
        
    

编辑:

问题出在动画上。如果 setViewControllers() 函数中设置了动画:false,则页面浏览会转到正确的视图。 如果为 true,则在动画结束时,浏览量会转到上一页。

【问题讨论】:

在这些设备上运行什么操作系统?都一样吗? 是的,都一样 (9.3)。即使在模拟器中(不仅是物理设备) 【参考方案1】:

经过一番尝试,我暂时解决了在self.pageViewController!.setViewControllers() 中设置 false 动画参数的问题。 似乎是一个 ios 错误。

所以,我添加了一个 isAnimated:bool 变量,仅用于 iPad 设备的动画;这是我的更新:

func slideToPage(index: Int, completion: (() -> Void)?) 
    if index >= dataSource.controllers.count || index < 0 
        return
    

    let currentViewController = pageViewController?.viewControllers![0] as! WebViewViewController
    let currentPageIndex = dataSource.controllers.indexOf(currentViewController)!
    let isAnimated = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad)

    // Moving forward
    if index > currentPageIndex 
        if let vc: WebViewViewController = dataSource.controllers[index] 
            self.pageViewController!.setViewControllers([vc], direction: UIPageViewControllerNavigationDirection.Forward, animated: isAnimated, completion:  complete in
                vc.loadContent()
            )
        
    
    // Moving backward
    else if index < currentPageIndex 
        if let vc: WebViewViewController = dataSource.controllers[index] 
            self.pageViewController!.setViewControllers([vc], direction: UIPageViewControllerNavigationDirection.Reverse, animated: isAnimated, completion:  complete in
                vc.loadContent()
            )
        
    

【讨论】:

以上是关于UIPageViewController - 以编程方式更改页面在 iPhone 4s/5/5s 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewController - 不符合协议

UIPageViewController 方向只向前

UIPageViewController 和 UIScrollView

NavigationController 中的 UIPageViewController

如何删除 UIPageViewController 中的 previousViewControllers

UIPageViewController -presentationCount 不触发