UIPageViewController: pageViewController: spineLocationForInterfaceOrientation: не вызывается - PullRequest
3 голосов
/ 13 октября 2011

мой метод spineLocationForInterfaceOrientation не вызывается; следовательно, позвоночник всегда слева, но я бы хотел, чтобы он был посередине ... что я делаю не так?

if ([UIPageViewController class]) {
    self.pageViewController = [[UIPageViewController alloc]
        initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl
        navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
    self.pageViewController.view.backgroundColor = [UIColor redColor];
    self.pageViewController.delegate = self;

    NotesPageController *notesPageController = [[NotesPageController alloc]
        initWithNibName:@"NotesPageController" bundle:nil];
    NSArray *pageViewControllers = [NSArray arrayWithObjects:notesPageController, nil];
    [self.pageViewController setViewControllers:pageViewControllers
        direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];

    self.pageViewController.dataSource = self;

    [self addChildViewController:self.pageViewController];

    [self.navigationController pushViewController:self.pageViewController animated:NO];
}

Большое спасибо!

Ответы [ 4 ]

12 голосов
/ 08 ноября 2011

У вас есть контроллер представления, который содержит код выше, правильно вставленный в иерархию контроллера представления?Начните с установки UIWindow.rootViewController, а затем вызовите addChildViewController: на каждом контроллере в иерархии.Это то, что мне было необходимо, чтобы при переоборудовании приложения для iOS 4 вызывался механизм пересылки вращения и функция позвоночника.

Редактировать: Я обнаружил, что это еще не все.Apple сделала этот класс довольно сложным в использовании.Проблема в том, что если вы хотите создать UIPageViewController в другое время, чем при первом вызове setViewControllers.Скорее всего, контроллер, который содержит UIPageViewController, собирается создать его в init или viewDidLoad.Но на данный момент истинная ориентация неизвестна, потому что приложения всегда запускаются в портретной ориентации, а затем отправляются уведомления о ротации, если это действительно в альбомной ориентации.Таким образом, в тот момент, когда большинство приложений собираются создать UIPageViewController, они не знают, где должен быть расположен позвоночник.

Примеры вызовов Apple setViewControllers одновременно с initWithTransitionStyle.Это работает в тривиальном примере, как в Apple, но большинство приложений, вероятно, будут динамически загружать контент позже.Если вы не установили никаких контроллеров представления, то spineLocationForInterfaceOrientation не вызывается.

Итак, вы застряли, если вы уже создали UIPageViewController с initWithTransitionStyle.Вы не можете установить местоположение позвоночника, и вы должны вставить точно правильное количество контроллеров представления для того, как вы инициализировали класс, когда вы не знали истинную ориентацию.Если вы укажете неверное количество контроллеров представления, он ничего не отобразит на экране.

Я вижу два возможных решения:

  1. Всегда вставлять фиктивный UIViewController сразу после вызова initWithTransitionStyle.Наличие контроллера представления заставит его реагировать на события вращения, и будет вызван spineLocationForInterfaceOrientation.

  2. Задержка создания UIPageViewController до тех пор, пока вы не будете готовы установить фактическое содержимое иистинная ориентация известна.Это то, что я выбрал.

5 голосов
/ 13 октября 2011

Вы пытались установить свойство позвоночника вручную?

Чтобы задать местоположение позвоночника, оберните одну из этих констант в объект NSNumber и задайте ее в качестве значения для ключа UIPageViewControllerOptionSpineLocationKey в словаре параметров, передаваемом вinitWithTransitionStyle: navigationOrientation: параметры: метод.

Ссылка: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIPageViewControllerClassReferenceClassRef/UIPageViewControllerClassReference.html

2 голосов
/ 30 декабря 2011

пример кода для ответа, предоставленного Totumus Maximus

NSDictionary *options =  [NSDictionary dictionaryWithObject:
 [NSNumber numberWithInteger:UIPageViewControllerSpineLocationMid]
                            forKey: UIPageViewControllerOptionSpineLocationKey];    
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:options];
1 голос
/ 08 марта 2012

Вот что сработало для меня. Я использовал проект по умолчанию, который генерируется шаблоном просмотра страниц Apple. Но когда я использовал его внутри контроллера навигации, он не отображал позвоночник должным образом, поэтому пришлось изменить код инициализации, который можно вызвать из метода viewDidLoad.

- (void)initializePageViewController
{
    int numberOfPagesPerScreen = 1;
    if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation))
      numberOfPagesPerScreen = 1;
    else
      numberOfPagesPerScreen = 2;       

    // for two-page layouts, we'll need to specify the spine location
    NSDictionary *pageViewOptions = nil;
    if(numberOfPagesPerScreen == 2)
      pageViewOptions = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInteger:UIPageViewControllerSpineLocationMid], UIPageViewControllerOptionSpineLocationKey, nil];  

    self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:pageViewOptions];
    self.pageViewController.delegate = self;

    NSMutableArray *pageViewControllers = [NSMutableArray array];

    for(int pageViewIdx = 0; pageViewIdx < numberOfPagesPerScreen; pageViewIdx++) {
      MyPageViewController *pageController = [self.modelController viewControllerAtIndex:pageViewIdx storyboard:self.storyboard];
      [pageViewControllers addObject:pageController];
    }
    [self.pageViewController setViewControllers:pageViewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];

    self.pageViewController.dataSource = self.modelController;

    [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.
    CGRect pageViewRect = self.view.bounds;
    pageViewRect = CGRectInset(pageViewRect, 40.0, 40.0);
    self.pageViewController.view.frame = pageViewRect;

    [self.pageViewController didMoveToParentViewController:self];

    // Add the page view controller's gesture recognizers to the book view controller's view so that the gestures are started more easily.
    self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...