停止 UIPageViewController 的滚动事件

Posted

技术标签:

【中文标题】停止 UIPageViewController 的滚动事件【英文标题】:Stop scroll events for UIPageViewController 【发布时间】:2015-04-23 14:08:31 【问题描述】:

我的 ViewController 中有一个 UIPageViewController。我的 PageViewController 中有四个视图。我希望视图不应该在右侧滚动的第一个视图和左侧滚动的第四个视图上滚动。我怎么做?基本上我需要像(BOOL)scrollViewShouldScroll:这样的方法

我尝试使用scrollViewDidBeganDragging 并设置 contentOffset 属性,将panGestureRecognizer's enabled 设置为false/true,但它确实会停止滚动但运气不好。

【问题讨论】:

你想要这个吗:禁用 已禁用? 是的,但它是 [0]...[3]但没有问题。 @Masterfego 怎么做? 【参考方案1】:

我已经创建了两个 ViewController:

RootViewController:我在其中管理 UIPageViewController

DataViewcontroller:我在哪里显示我想要的(我们的页面)

class RootViewController: UIViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource

  var pageData:[String] = [] // where I store images names


实现这两种方法:

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? 

  if !viewController.isKindOfClass(DataViewController) // Specify your type
  
    return nil
  

    var index:Int = indexOfViewController(viewController as! DataViewController)
  if index == 0
  
    return nil
  
  else if index == NSNotFound
  
    return nil
  

  index--
  return self.viewControllerAtIndex(index)


.

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? 

  if !viewController.isKindOfClass(DataViewController)  // Specify your type
  
    return nil
  

  var index:Int = indexOfViewController(viewController as! DataViewController)
  if index == NSNotFound
  
    return nil
  

  index++   
  if index == self.pageData.count 
  
    return nil
       

  return self.viewControllerAtIndex(index)

个人职能:

func indexOfViewController(viewController: DataViewController) -> Int

  return find(pageData, viewController.dataObject)!

.

func viewControllerAtIndex( index: Int) -> DataViewController! 
  if pageData.count == 0 || index >= pageData.count 
    return nil
  

  var dataVC:DataViewController = self.storyboard!.instantiateViewControllerWithIdentifier("DataViewController") as! DataViewController
  dataVC.dataObject = pageData[index] as String

  return dataVC

【讨论】:

您是否测试过您的代码。我已经尝试过了,但它不起作用。返回 nil 只是停止显示任何视图控制器,但不会停止滚动事件。 这段代码有效,它实际上是我在应用商店发布的应用程序中使用的,给你我的代码的一部分给你灵感。您必须关注前两个数据源方法: func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController ) -> UIViewController? 你可以发布你的代码 我想要的是当你在第四个屏幕上向左滚动时它应该什么都不做。它不应该显示我的父视图的黑屏。视图应该保持静止。 @Masterfego 流星需要的是暂停监听滚动事件,直到某个布尔变量为真。再次开始监听滚动事件。但是在前后控制视图控制器只会在滚动后显示黑屏,当布尔变量为真时,您需要先返回然后再下一步,以使用户继续使用新的视图控制器。

以上是关于停止 UIPageViewController 的滚动事件的主要内容,如果未能解决你的问题,请参考以下文章

在 UIPageviewcontroller 中停止 HTML5 音频

UIPageViewController 在 SwiftUI 中滑动 1 次后停止工作

如何让 uipageviewcontroller 转圈

Swift UIPageViewController & UIActivityIndi​​catorView

如何使 UIPageViewController 过渡行为类似于 IOS7 中的交互式弹出过渡样式

uipageviewcontroller 中的 Swift uipageviewcontroller