【问题标题】:Disable/enable scrolling in UIPageViewController在 UIPageViewController 中禁用/启用滚动
【发布时间】:2013-04-05 08:27:03
【问题描述】:

我有一个viewController,它继承自UIPageViewController (@interface PageScrollViewController : UIPageViewController) 现在我想知道如何启用和禁用UIPageViewController 的滚动?使用UIScrollView 时,您可以使用setScrollEnabled:NOself.view.userInteractionEnabled = NO;,因为这会阻止整个UIView 而不仅仅是滚动。

编辑 这是在PageScrollViewController : UIPageViewController 类中:

if ([[notification name] isEqualToString:@"NotificationDisable"]){
    NSLog (@"Successfully received the disable notification!");
    for (UIGestureRecognizer *recognizer in self.gestureRecognizers) {
        recognizer.enabled = NO;
    }
}

【问题讨论】:

    标签: iphone ios objective-c


    【解决方案1】:

    或者你可以在你的 PagingVC 中强制禁用分页:

    self.delegate = nil;
    self.dataSource = nil;
    

    然后再次启用它:

    self.delegate = self;
    self.dataSource = self;
    

    【讨论】:

      【解决方案2】:

      尝试遍历UIPageViewControllergestureRecognizers 并禁用/启用它们:

      for (UIGestureRecognizer *recognizer in pageViewController.gestureRecognizers) {        
              recognizer.enabled = NO;
      }
      

      注意:如在this SO post 中找到的,此方法仅适用于UIPageViewControllerTransitionStylePageCurl。你可能想试试this solution(虽然它看起来有点hacky)。

       for recognizer in pageViewController.gestureRecognizers {
          recognizer.isEnabled = false
      }
      

      【讨论】:

      • 你在哪里执行这个循环?看看一些代码会很有帮助。
      • 所以您收到“成功接收...”消息?如果是这样,请尝试NSLog(@"Gesture recognizers: %@",self.gestureRecognizers)
      • 是的,我收到“成功接收...”消息。 NSLog 向我显示:手势识别器:( )
      • 使用您给我的第二种解决方案,如果我已将代码放入 viewDidLoad,我该如何禁用和启用滚动?
      • 这个答案已经说明了:One workaround that comes to my mind is laying a transparent subview on top of your UIPageViewController and add to it a UIPanGestureRecognizer to intercept that kind of gesture and not forward further. You could enable this view/recognizer when disabling the gesture is required.
      【解决方案3】:

      我做了以下事情(我有一个持有 UIPageViewController 的控制器)。

      self.pageController.view.userInteractionEnabled = NO;
      

      当您想要启用滑动或滚动时,只需启用用户交互即可。

      【讨论】:

      • 不幸的是,这也会禁用您在 vc 中的任何控件。
      • 正如@Shinonuma 所说:“self.view.userInteractionEnabled = NO; 不是一个选项,因为这会阻止整个 UIView 而不仅仅是滚动。”
      • @MárioCarvalho 是的,它会禁用任何手势,这是该解决方案的缺陷。 :( 我发布了这个,因为它可以帮助某人并且在搜索其解决方案时就足够了(就像我一样)。
      【解决方案4】:

      将 UIPageViewController dataSource 属性设置为 nil 可防止滚动,因为页面视图控制器无法确定要转换到的“下一个”视图控制器。

      self.dataSource = nil // scrolling disabled
      
      self.dataSource = self // scrolling enabled
      

      【讨论】:

      • 这实际上是最好的答案,以防您的标签页也是滚动视图 - 这会禁用分页,但您仍然可以控制 vc
      【解决方案5】:

      UIPageViewController 在内部管理 UIScrollView 以完成工作。我们可以找出UIScrollView 并更新它的isScrollEnabled 属性。

      let view = myPageViewController.view
      for subview in view.subviews {
          if let scrollview = subview as? UIScrollView {
              scrollview.isScrollEnabled = false
              break
          }
      }
      

      或者使用这个UIPageViewController 扩展。

      extension UIPageViewController {
      
          var scrollView: UIScrollView {
              for subview in view.subviews {
                  if let scrollview = subview as? UIScrollView {
                      return scrollview
                  }
              }
              fatalError()
          }
          
          var isScrollEnabled: Bool {
              get {
                  return scrollView.isScrollEnabled
              }
              set {
                  scrollView.isScrollEnabled = newValue
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-24
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        相关资源
        最近更新 更多