UIPageViewController реагирует на вертикальное панорамирование, когда ориентация установлена ​​​​на горизонтальную

Я сжег часы на этом. Я инициализировал UIPageViewController с помощью UIPageViewControllerNavigationOrientationHorizontal, но по какой-то причине viewControllerBeforeViewController вызывается, когда пользователь перемещается по вертикали.

Кроме того, когда это происходит, перелистывание страниц не происходит и didFinishAnimating:didFinishAnimating:previousViewControllers:transitionCompleted вообще не вызывается. Это означает, что контроллер просмотра страницы знает, что это вертикальное движение.

Это код инициализации -

- (void)initPageViewController
{
    self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl
                                                              navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal 
                                                                            options:nil];
    self.pageViewController.delegate = self;
    self.pageViewController.dataSource = self;

    [self addChildViewController:self.pageViewController];
    [self.view addSubview:self.pageViewController.view];

    // Set the page view controller's bounds using an inset rect so that self's view is visible around the edges of the pages.
    self.pageViewController.view.frame = self.view.bounds;

    [self.pageViewController didMoveToParentViewController:self];

    // Leave only pan recognizers enabled, so buttons positioned inside a page would work.
    for (UIGestureRecognizer *gr in self.pageViewController.gestureRecognizers)
    {
        if ([gr class] != [UIPanGestureRecognizer class])
            gr.enabled = NO;
    }
}

Любые идеи?


person Kof    schedule 29.06.2012    source источник


Ответы (1)


Сначала я наткнулся на ваш вопрос, столкнувшись с той же проблемой, но, похоже, я исправил ее для своей ситуации.

По сути, мне нужно было установить делегата для всех распознавателей жестов, подключенных к UIPageViewController. Итак, вскоре после создания UIPageViewController я сделал:

for (UIGestureRecognizer *gr in self.book.gestureRecognizers)
    gr.delegate = self.book;

где book - это мой пользовательский UIPageViewController (по сути, я установил себя в качестве делегата). Наконец, добавьте этот метод в свой UIPageViewController, чтобы ограничить любое вертикальное панорамирование (или используйте закомментированную строку вместо этого, чтобы ограничить горизонтальное панорамирование).

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
    {
        UIPanGestureRecognizer *panGestureRecognizer = (UIPanGestureRecognizer *)gestureRecognizer;
        CGPoint translation = [panGestureRecognizer translationInView:self.view];

        return fabs(translation.x) > fabs(translation.y);
//      return fabs(translation.y) > fabs(translation.x);
    }
    else
        return YES;
}

Мне намекнули на это благодаря этому ответу - просто убедитесь, что вы отфильтровываете только UIPanGestureRecognizers.

person pxlshpr    schedule 19.09.2012
comment
попробовал это, но для меня распознаватель застревает после первого события и всегда возвращает одно и то же значение перевода впоследствии... - person Lvsti; 26.10.2012
comment
Я опубликовал другое возможное решение в этой теме: viewcontrollerafter, но не анимирует"> stackoverflow.com/questions/12533240/, вы также можете проверить это. - person Lvsti; 07.11.2012
comment
Ура Ахмед, это решило это. Хотя я не понимаю, почему этого не делает контроллер просмотра страницы. - person Kof; 15.12.2012
comment
Это решение вызвало исключение границ при подкачке на последней странице. Эта проблема была решена в этом (stackoverflow.com/questions/12561336/) также помогло мне, поэтому оно должно быть неотъемлемой частью этого решения. - person Kof; 19.12.2012