UIPageViewController 禁用滚动

Posted

技术标签:

【中文标题】UIPageViewController 禁用滚动【英文标题】:UIPageViewController disable scrolling 【发布时间】:2012-11-14 05:32:30 【问题描述】:

我正在使用带有 transitionStyle UIPageViewControllerTransitionStyleScroll 和 navigationOrientation UIPageViewControllerNavigationOrientationVertical 的 UIPageViewController

我在视图上还有一个UIPanGestureRecognizer,我想在平移手势处于活动状态时禁用页面滚动。

我正在尝试在手势开始时设置以下内容:

pageViewController.view.userInteractionEnabled = NO;

这似乎没有效果,或者它似乎偶尔起作用。

我发现的唯一其他方法(可行)是在平移手势运行时将 UIPageViewController 数据源设置为 nil,但是这会在重置数据源时导致巨大的延迟。

【问题讨论】:

【参考方案1】:

UIPageViewController 使用一些 UIScrollView 对象来处理滚动(至少对于 transitionStyle UIPageViewControllerTransitionStyleScroll)。您可以通过控制器的子视图pageViewController.view.subviews 进行迭代以获取它。现在,您可以轻松启用/禁用滚动:

- (void)setScrollEnabled:(BOOL)enabled forPageViewController:(UIPageViewController*)pageViewController

    for (UIView *view in pageViewController.view.subviews) 
        if ([view isKindOfClass:UIScrollView.class]) 
            UIScrollView *scrollView = (UIScrollView *)view;
            [scrollView setScrollEnabled:enabled];
            return;
        
    

【讨论】:

我已经搜索了一段时间,这是我找到的关于禁用 UIPageViewController 滑动但保持点击移动的最佳答案。 在 swift 中,如果你喜欢简洁的东西有点难以阅读:pageViewController.view.subviews.flatMap( $0 as? UIScrollView).forEach($0.isScrollEnabled = enabled)【参考方案2】:

对于那些使用 swift 而不是 Objective-c 的人,这里是 Squikend 的转置解决方案。

func findScrollView(#enabled : Bool) 
    for view in self.view.subviews 
      if view is UIScrollView 
        let scrollView = view as UIScrollView
        scrollView.scrollEnabled = enabled;
       else 
        println("UIScrollView does not exist on this View")
      

    
  

【讨论】:

【参考方案3】:

每个人都非常非常复杂。

这是禁用或启用滚动所需的全部功能。

    func enableScroll(_ enable: Bool) 
        dataSource = enable ? self : nil
    

【讨论】:

【参考方案4】:

Swift 4.2 版本的答案

func findScrollView(enabled: Bool) 
    for view in self.view.subviews 
        if view is UIScrollView 
            let scrollView = view as! UIScrollView
            scrollView.isScrollEnabled = enabled
         else 
            print("UIScrollView does not exist on this View")
        

    

然后 yourpagecontorller.findScrollView(enabled: false)

【讨论】:

【参考方案5】:

您也可以禁用手势识别器。

for (UIGestureRecognizer *recognizer in pageViewController.gestureRecognizers)

    recognizer.enabled = NO;

与流行的答案不同,它依赖于内部UIScrollView 的存在,这个使用公共gestureRecognizers 数组。如果您使用书本式分页,则底层滚动视图可能不存在。

【讨论】:

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

在其中一个页面中包含的 UISwitch 上开始触摸时禁用 UIPageViewController 滚动

禁用 UIPageViewController 弹跳 - Swift [重复]

自定义 viewcontroller 容器(类似于 UIPageViewController),但没有滚动反弹

禁用和启用页面滚动 (Swift)

禁用 UIPageViewController 反弹

仅在 uiPageViewController 中禁用临时向前滑动