Подтвердить что ты не робот

UISlider внутри UIPageViewController

У меня есть элемент PageViewController, который инициализируется следующим образом:

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
                          navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

На одной из страниц есть UISlider.

Моя проблема в том, что когда у меня есть переходный стиль, установленный в UIPageViewControllerTransitionStyleScroll, он принимает 150-200 мс, прежде чем beginTrackingWithTouch вызывается на слайдере. Такое поведение не наблюдается, когда я использую UIPageViewControllerTransitionStylePageCurl, где UISlider выбирается мгновенно.

Это означает, что, если пользователь не ждет бит перед перетаскиванием ползунка (прогресс видео), вместо него будет отображаться страница, которая далеко не идеальна.

Анимация страницы не соответствует требованиям приложения, поэтому любое объяснение или обходное решение оцениваются.

4b9b3361

Ответ 1

Поскольку с распознавателями жестов UIPageViewControllerTransitionStyleScroll недоступен, вы можете использовать это:

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

Ответ 2

Вы можете попытаться установить делегат жестов контроллера просмотра страницы на контроллер корневого представления:

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); 
}

Ответ 3

Я решил эту проблему, добавив жесты на 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);
}

Ответ 4

Что мне помогло - добавить в UIView функцию распознавания жеста, которая содержит UISlider, так что в конце концов у меня есть UIPageViewController- > UIScrollView → ...- > MyView- > UISlider В элементе "MyView" был записан жест жестка, который ничего не делал, но служил просто для того, чтобы НЕ распространять события для прокрутки.