UISlider 管理 UIPageViewController 分页
UISlider to manage UIPageViewController pagination
我想使用 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];
}
您可以通过应用以下 post 中的一种技术仅在滑块结束滑动时更新 pageControl:iPhone : How to detect the end of slider drag?
在滑动的同时不断改变值对于这种操作来说风险太大。如果你真的出于某种原因需要不断更新页面,你将不得不做出一些妥协,这将需要一些努力。
乍一看,我想到了这个策略:
- 添加一些 BOOL 属性,我们将其命名为 'isPresenting' 并将其初始设置为 NO。
- 在 sliderValueChange 上,如果 isPresenting 为 NO,则开始呈现视图。
- 将 属性 'isPresenting' 设为是。
- 当每个视图完成自我呈现时,将 isPresenting 设置为 NO。
- 检查滑块是否在滑动,如果没有则手动调用
changeValueSlider:
注意:第 4 步和第 5 步应该从 child 视图 (viewDidAppear:
) 执行,因此您应该使用协议或本地通知来执行此操作,或者参考 parent 在 children 中查看控制器并从 child.
调用 parent 的方法
我想使用 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];
}
您可以通过应用以下 post 中的一种技术仅在滑块结束滑动时更新 pageControl:iPhone : How to detect the end of slider drag?
在滑动的同时不断改变值对于这种操作来说风险太大。如果你真的出于某种原因需要不断更新页面,你将不得不做出一些妥协,这将需要一些努力。 乍一看,我想到了这个策略:
- 添加一些 BOOL 属性,我们将其命名为 'isPresenting' 并将其初始设置为 NO。
- 在 sliderValueChange 上,如果 isPresenting 为 NO,则开始呈现视图。
- 将 属性 'isPresenting' 设为是。
- 当每个视图完成自我呈现时,将 isPresenting 设置为 NO。
- 检查滑块是否在滑动,如果没有则手动调用
changeValueSlider:
注意:第 4 步和第 5 步应该从 child 视图 (viewDidAppear:
) 执行,因此您应该使用协议或本地通知来执行此操作,或者参考 parent 在 children 中查看控制器并从 child.