UIPageViewController иногда переходит без анимации. Зачем? - PullRequest
2 голосов
/ 08 февраля 2012

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

Почему это? Может ли это быть из-за того, что в фоновом режиме происходят некоторые вызовы БД, которые могут мешать анимации пользовательского интерфейса?

Спасибо

РЕДАКТИРОВАТЬ: Вот код, который обрабатывает переходы

#pragma mark - UIPageViewControllerDataSource Methods

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
  viewControllerBeforeViewController:(UIViewController *)viewController
{
currentIndex = [self.modelArray indexOfObject:[(ContentViewController *)viewController labelContents]];
if(currentIndex == 0)
{
    return nil;
}
ContentViewController *contentViewController = [[ContentViewController alloc] init];
contentViewController.labelContents = [self.modelArray objectAtIndex:currentIndex - 1];

[data setCurrentPage:currentIndex-1];
return contentViewController;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
   viewControllerAfterViewController:(UIViewController *)viewController
{
currentIndex = [self.modelArray indexOfObject:[(ContentViewController *)viewController labelContents]];
if(currentIndex == self.modelArray.count-1)
{
    return nil;
}
ContentViewController *contentViewController = [[ContentViewController alloc] init];
contentViewController.labelContents = [self.modelArray objectAtIndex:currentIndex + 1];

[data setCurrentPage:currentIndex+1];


return contentViewController;
}

#pragma mark - UIPageViewControllerDelegate Methods

- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController
               spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation
{
if(UIInterfaceOrientationIsPortrait(orientation))
{
    //Set the array with only 1 view controller
    UIViewController *currentViewController = [self.pageViewController.viewControllers objectAtIndex:0];
    NSArray *viewControllers = [NSArray arrayWithObject:currentViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];

    //Important- Set the doubleSided property to NO.
    self.pageViewController.doubleSided = NO;
    //Return the spine location
    return UIPageViewControllerSpineLocationMin;
}
else
{
    NSArray *viewControllers = nil;
    ContentViewController *currentViewController = [self.pageViewController.viewControllers objectAtIndex:0];

     currentIndex = [self.modelArray indexOfObject:[(ContentViewController *)currentViewController labelContents]];
    if(currentIndex == 0 || currentIndex %2 == 0)
    {
        UIViewController *nextViewController = [self pageViewController:self.pageViewController viewControllerAfterViewController:currentViewController];
        viewControllers = [NSArray arrayWithObjects:currentViewController, nextViewController, nil];
    }
    else
    {
        UIViewController *previousViewController = [self pageViewController:self.pageViewController viewControllerBeforeViewController:currentViewController];
        viewControllers = [NSArray arrayWithObjects:previousViewController, currentViewController, nil];
    }
    //Now, set the viewControllers property of UIPageViewController
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];

    return UIPageViewControllerSpineLocationMid;
}
}

1 Ответ

1 голос
/ 05 июня 2012

Я думаю, это из-за вашей строки:

[data setCurrentPage:currentIndex-1]; 

в вашей функции viewControllerBeforeViewController: и viewControllerAfterViewController:.

Эти функции должны возвращать только соответствующий viewController.Задача по смене текущего контроллера и воспроизведению анимации принадлежит не вам, а делегату UIPageViewControllerDataSource.если вы установите его самостоятельно, анимация не будет

...