UIPageViewController - 在iPhone 4s/5/5s上无法通过编程方式更改页面

4

我有一个可在iPad/iPhone上运行的应用程序,它在所有设备和版本上都能完美运行,但无法在iPhone 4S、5和5s上运行。

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

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

对于iPhone 4S/5/5S,当动画完成后,它会立即返回到旧页面,因此用户无法跳转页面,只能一页一页地翻页:

enter image description here

以下是我的代码:

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()函数中设置animation:false,页面视图就会转到正确的视图。 如果设置为true,在动画结束时,页面视图会转到上一页。


这些设备上运行的操作系统是什么?都一样吗? - Behran Kankul
是的,都一样(9.3)。即使在模拟器中(不仅仅是物理设备)。 - Alessio Zap Boerio
1个回答

1

经过一些尝试,我目前解决了在self.pageViewController!.setViewControllers()中将动画参数设置为false。看起来是iOS的一个bug。

因此,我添加了一个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()
            })
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接