UIPageViewController 内的 UISlider
Posted
技术标签:
【中文标题】UIPageViewController 内的 UISlider【英文标题】:UISlider inside UIPageViewController 【发布时间】:2013-06-19 07:15:03 【问题描述】:我有一个像这样初始化的 PageViewController:
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
在其中一个页面上,有一个 UISlider。
我的问题是,当我将 transitionstyle 设置为 UIPageViewControllerTransitionStyleScroll
时,在滑块上调用 beginTrackingWithTouch
之前需要 150-200 毫秒。
当我使用UIPageViewControllerTransitionStylePageCurl
时,不会出现这种行为,其中 UISlider 会立即被选中。
这意味着除非用户在拖动滑块(视频进度)之前稍等片刻,否则页面将会翻转,这远非理想。
页面卷曲动画不符合应用程序的要求,因此感谢任何解释或解决方法。
【问题讨论】:
【参考方案1】:由于 UIPageViewControllerTransitionStyleScroll 手势识别器不可用,你可以使用这个:
for (UIView *view in pageViewController.view.subviews)
if ([view isKindOfClass:[UIScrollView class]])
UIScrollView *scrollView = (UIScrollView *)view;
scrollView.delaysContentTouches = NO;
【讨论】:
嗨,我不明白如何使用这个解决方案......你能开发更多在哪里添加这个代码,以及为什么在 scrollView 上设置 delaysContentTouches 有效吗?谢谢 您可以在创建 UIPageViewController 后将此代码放在下一行。或者您可以继承 UIPageViewController 并将此代码放在 viewDidLoad 方法中,只需使用“self”而不是“pageViewController”。当“delaysContentToushes”为“NO”时,滚动视图会立即将触摸转发到内容,并且不会在内容处理触摸之前尝试执行滚动 感谢您的解释。这对我来说好一点,但是 pageViewController 仍然首先对滑块的触摸做出反应。 swift3:for view in view.subviews if view is UIScrollView (view as! UIScrollView).delaysContentTouches = false
斯威夫特 4:for view in pageVC.view.subviews if let scrollView = view as? UIScrollView scrollView.delaysContentTouches = false
【参考方案2】:
我通过在 UISlider 上添加平移手势并设置解决了这个问题:
self.sliderGesture.cancelsTouchesInView = NO; // make touch always triggered
并实现委托方法,如:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
return otherGestureRecognizer.view.superview == self.parentViewController.view;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
// only receive touch in slider
CGPoint touchLocation = [touch locationInView:self.view];
return CGRectContainsPoint(self.slider.frame, touchLocation);
【讨论】:
【参考方案3】:您可以尝试将页面视图控制器手势的委托设置为根视图控制器:
for (UIGestureRecognizer* gestureRecognizer in self.pageViewController.gestureRecognizers)
gestureRecognizer.delegate = self;
如果手势出现在 UIControl 的子类 UISlider 中,则阻止手势的触摸:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
return ([touch.view isKindOfClass:[UIControl class]] == NO);
【讨论】:
问题是当transitionstyle= UIPageViewControllerTransitionStyleScroll时没有设置手势识别器,因此这个问题:link【参考方案4】:对我有帮助的是将 pan-gesture-recognizer 添加到包含 UISlider 的 UIView 中,所以最后我有了 UIPageViewController->UIScrollView->...->MyView->UISlider 'MyView' 的东西注册了平移手势,它什么也没做,但只是为了不将事件传播到滚动视图。
【讨论】:
以上是关于UIPageViewController 内的 UISlider的主要内容,如果未能解决你的问题,请参考以下文章
UIPageViewController 内的 UISlider
带有 UINavigationBar 的 UIPageViewController 内的 UIWebView
UIPageViewController 内的 UITableViewController,如何防止对角拖动
UIPageViewController EdgeInset 内的 UITableView 问题