避免 UIPageViewController “过度滚动”

Posted

技术标签:

【中文标题】避免 UIPageViewController “过度滚动”【英文标题】:Avoid UIPageViewController "over-scrolling" 【发布时间】:2015-12-24 13:00:38 【问题描述】:

我的UIPageViewController 上有 2 个 VC。

我希望如果用户在第一个视图上,他将无法向右滑动(只是向左滑动到第二个视图),如果他在第二个视图上,他将不会能够向左滑动(仅向右滑动 - 到第一个视图)。

我希望用户无法滚动 - 不是黑色视图(当我返回 nil 时会发生什么:- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController)

【问题讨论】:

您希望他们能够将其拖动一点,然后快速返回,还是希望他们根本无法滚动? return nil 给了我正确的行为。你实现presentationCountForPageViewController了吗? 【参考方案1】:
    “黑色视图”可能是主视图的背景,或者是 UIPageViewController 的背景颜色。 您可以根据 PageViewController 当前显示的 ViewController 终止滚动方向之一

首先将您的 VC 设置为 PageViewController 的内部滚动视图的委托。你可以在这里添加更复杂的子视图遍历,这是一个简单的版本:

for (UIView *view in self.pageViewController.view.subviews) 
    if ([view isKindOfClass:[UIScrollView class]]) 
         [(UIScrollView *)view setDelegate:self];
    
 

然后将属性添加到您的 VC,如下所示:

@property (nonatomic) CGPoint lastOffset;

然后实现以下滚动视图委托方法

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
    scrollView.scrollEnabled = YES;


- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
    scrollView.scrollEnabled = YES;
    self.lastOffset = scrollView.contentOffset;


- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
    CGPoint nowOffset = scrollView.contentOffset;
    NSLog(@"delta %f", self.lastOffset.x - nowOffset.x);
    if ((self.lastOffset.x - nowOffset.x) < 0) 
        //uncomment to prevent scroll to left
        //scrollView.scrollEnabled = NO;
     else if ((self.lastOffset.x - nowOffset.x) > 0) 
        //uncomment to prevent scroll to right
        //scrollView.scrollEnabled = NO;
     else 
        scrollView.scrollEnabled = YES;
    

【讨论】:

以上是关于避免 UIPageViewController “过度滚动”的主要内容,如果未能解决你的问题,请参考以下文章

uipageviewcontroller 中的 Swift uipageviewcontroller

如何从属于 UIPageViewController 的 UIViewController 之一更改 UIPageViewController?

UIPageViewController - 不符合协议

UIPageViewController 方向只向前

UIPageViewController 和 UIScrollView

NavigationController 中的 UIPageViewController