我想使用UISlider控件来管理UIPageViewController分页。我已经设法获取了页面数,这些是滑块用于scroll分页的值。

现在,它正在工作。当我如此快速地更改值时,问题就来了。谁知道我该如何解决?

- (void)changeValueSlider:(UISlider *)slider {
   [self goToPageAtIndex:slider.value];
}

- (void)goToPageAtIndex:(NSUInteger)index {
    MNBBasePreviewViewController *currentViewController = self.pageViewController.viewControllers.firstObject;
    if (index < self.previewContainerInteractor.count){
        if (index < currentViewController.index) {
            [self backToPageAtIndex:index];
        } else if (index > currentViewController.index) {
            [self forwardToPageAtIndex:index];
        }
    }
}

- (void)forwardToPageAtIndex:(NSUInteger)index {
    MNBBasePreviewViewController *previewViewController = [self viewControllerAtIndex:index];
    [self.pageViewController setViewControllers:@[previewViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];
}

- (void)backToPageAtIndex:(NSUInteger)index {
    MNBBasePreviewViewController *previewViewController = [self viewControllerAtIndex:index];
    [self.pageViewController setViewControllers:@[previewViewController] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:NULL];
}

最佳答案

您仅可以通过应用以下文章中的一种技术来更新pageControl:仅当滑块结束滑动时:iPhone : How to detect the end of slider drag?

对于这种操作,在滑动时连续更改值风险太大。如果确实出于某种原因需要连续更新页面,则必须做出一些妥协,这需要付出一些努力。
乍一看,我想到了这个策略:


添加一些BOOL属性,我们将其称为“ isPresenting”并将其初始设置为NO。
在SliderValueChange上,如果isPresenting为NO,则开始显示视图。
将属性“ isPresenting”设置为“是”。
当每个视图完成显示时,将isPresenting设置为NO。
检查滑块是否在滑动,如果没有手动调用changeValueSlider:


注意:步骤4和5.应该从子视图(viewDidAppear:)执行,因此您应该使用协议或本地通知来执行此操作,或者在子视图中引用父视图控制器,并从child调用父方法。

关于ios - UISlider管理UIPageViewController分页,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35868662/

10-10 11:51
查看更多