Cocoa touch UIPageViewController中的UISlider

Cocoa touch UIPageViewController中的UISlider,cocoa-touch,uislider,uipageviewcontroller,Cocoa Touch,Uislider,Uipageviewcontroller,我有一个PageViewController,其初始化如下: self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizont

我有一个PageViewController,其初始化如下:

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
                          navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
其中一页上有一个滑环

我的问题是,当我将transitionstyle设置为
UIPageViewControllerTransitionStyleScroll
时,需要150-200毫秒才能在滑块上调用
BegindKingWithTouch
。 当我使用
UIPageViewControllerTransitionStylePageCurl
时,不会看到这种行为,此时会立即选择UISlider

这意味着,除非用户在拖动滑块(视频进度)之前稍等片刻,否则页面将翻转,这远远不理想


页面卷曲动画不符合应用程序的要求,因此欢迎提供任何解释或解决方法。

您可以尝试将页面视图控制器手势的委托设置为根视图控制器:

for (UIGestureRecognizer* gestureRecognizer in self.pageViewController.gestureRecognizers) {
    gestureRecognizer.delegate = self;
}
然后,如果出现在UISlider(UIControl的子类)内,则防止触摸手势:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    return ([touch.view isKindOfClass:[UIControl class]] == NO); 
}

由于UIPageViewControllerTransitionStyleScroll手势识别器不可用,因此您可以使用:

for (UIView *view in pageViewController.view.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
        UIScrollView *scrollView = (UIScrollView *)view;
        scrollView.delaysContentTouches = NO;
    }
}

我通过在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);
}

帮助我的是将平移手势识别器添加到保存UISlider的UIView中,所以最终我得到了 UIPageViewController->UIScrollView->…->MyView->UISlider
“MyView”东西注册了pan手势,但没有任何作用,只是不将事件传播到scroll view。

问题是当transitionstyle=UIPageViewControllerTransitionStyleScroll时,没有设置手势识别器,因此出现以下问题:嗨,我不知道如何使用此解决方案。。。您是否可以在何处添加此代码,以及为什么在scrollView上设置delaysContentTouches有效?谢谢您可以在创建UIPageViewController后将此代码放在下一行。或者您可以将UIPageViewController子类化并将此代码放入viewDidLoad方法中,只需使用“self”而不是“pageViewController”。当“delaysContentToushes”为“否”时,scroll view forwards会立即触动内容,并且在内容处理触动之前不会尝试执行scroll。感谢解释。这对我来说稍微好一点,但pageViewController仍然会首先对滑块的触摸做出反应。swift3:
用于view.subviews{如果view是UIScrollView{(view as!UIScrollView).delaysContentTouches=false}
swift 4:
用于pageVC.view.subviews中的视图{如果让scrollView=view as?UIScrollView{scrollView.delaysContentTouches=false}}