在UIPageViewController中禁用/启用滚动

9
我有一个继承自UIPageViewControllerviewController@interface PageScrollViewController:UIPageViewController)。我想知道如何在UIPageViewController中启用和禁用滚动。当使用UIScrollView时,您可以执行setScrollEnabled:NO,而self.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;
    }
}
5个回答

12

或者您可以将其放入PagingVC中以禁用分页:

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

启用它的方法如下:

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

10

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

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

注意: 如此SO帖子所述,该方法仅适用于UIPageViewControllerTransitionStylePageCurl。您可能想尝试这个解决方案(尽管它似乎有点hacky)。

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

1
你在哪里执行这个循环?看一些代码会很有帮助。 - tilo
1
所以你收到了“成功接收到…”的消息吗?如果是的话,请尝试 NSLog(@"Gesture recognizers: %@",self.gestureRecognizers) - tilo
是的,我收到了“成功接收...”消息。NSLog向我显示:手势识别器:()。 - Shinonuma
使用您提供的第二种解决方案,如果我把代码放在viewDidLoad中,如何禁用和启用滚动? - Shinonuma
5
在这个答案中已经提到了:一种解决方法是在UIPageViewController上方放置一个透明的子视图,并添加一个UIPanGestureRecognizer来拦截这种手势,不再将其转发。您可以在需要禁用手势时启用此视图/识别器。 - tilo

8
我做了以下事情(我有一个控制器,它持有UIPageViewController)。
self.pageController.view.userInteractionEnabled = NO;

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


3
很遗憾,这也会禁用您在vc中拥有的任何控件。 - Fook
1
正如@Shinonuma所说:“self.view.userInteractionEnabled = NO;不是一个选项,因为它会阻止整个UIView而不仅仅是滚动。” - Mário Carvalho
1
@MárioCarvalho 是的,它禁用了所有手势,这是这种解决方案的缺陷。 :( 我发布了这个,因为它可以帮助某些人并足够(像我一样)在寻找解决方案时。 - Nemanja

3
将UIPageViewController的“dataSource”属性设置为“nil”会防止滚动,因为页面视图控制器没有确定要过渡到的“下一个”视图控制器的方式。
self.dataSource = nil // scrolling disabled

self.dataSource = self // scrolling enabled

1
实际上,这是最好的答案,如果您的选项卡页面也是一个滚动视图-这将禁用分页,但仍然使您对vc具有控制权。 - Jacky Wang

3

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
        }
    }
}

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