Для приложения, которое я создаю, у меня есть UIPageViewController внутри UIView с Transition Style = Scroll. Каждая из страниц имеет один и тот же класс UITableViewController (конечно, с разными данными). На этом этапе все работает правильно.

Теперь я хочу иметь альбомную или портретную версию UITableViewController в зависимости от ориентации устройства. Для этого я реализовал NSNotification с методом, вызываемым при изменении ориентации (directionChanged), это тоже работает. Но отсюда возникает проблема: при изменении ориентации устройства я не уверен, как загрузить правильный экземпляр UITableViewController. Как вы можете видеть, я использую метод делегата viewControllerAtIndex UIPageViewControllerDataSource, в котором я проверяю, что запущена горизонтальная или портретная версия viewController.

Проблема в том, что при изменении ориентации устройства правильный UITableViewController загружается только после пролистывания пары страниц влево / вправо. Я, должно быть, не замечаю чего-то простого, но не могу этого найти!

У меня есть следующие фрагменты кода, в которых, как мне кажется, проблема:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Create the data model
    _pageTitles = @[@"1",@"2",@"3",@"4",@"5"];
    _pageTables = @[@"test1",@"test2",@"test3",@"test4",@"test5"];

    // Create page view controller
    self.weightPageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"WeightPageViewController"];
    self.weightPageViewController.dataSource = self;

    WeightPageContentViewController *startingViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = @[startingViewController];
    [self.weightPageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

    [self addChildViewController:_weightPageViewController];
    [self.view addSubview:_weightPageViewController.view];
    [self.weightPageViewController didMoveToParentViewController:self];

    self.edgesForExtendedLayout = UIRectEdgeNone;

    //Register for device orientation changes.
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
}

- (void) orientationChanged:(id)object {
    [self viewControllerAtIndex:0];
}

- (WeightPageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
    if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) {
        return nil;
    }

    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation)) {
        NSLog(@"Orientation is now Landscape);
        // Create a new view controller and pass suitable data.
        WeightPageContentViewController *weightPageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"WeightPageContentViewControllerLandscape"];
        weightPageContentViewController.tableText = self.pageTables[index];
        weightPageContentViewController.titleText = self.pageTitles[index];
        weightPageContentViewController.pageIndex = index;
        return weightPageContentViewController;
    } else if (deviceOrientation == UIDeviceOrientationPortrait) {
        NSLog(@"Orientation is now Portrait);
        // Create a new view controller and pass suitable data.
        WeightPageContentViewController *weightPageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"WeightPageContentViewController"];
        weightPageContentViewController.tableText = self.pageTables[index];
        weightPageContentViewController.titleText = self.pageTitles[index];
        weightPageContentViewController.pageIndex = index;
        return weightPageContentViewController;
    } else {
        NSLog(@"Orientation is now unknown);
        // Create a new view controller and pass suitable data.
        WeightPageContentViewController *weightPageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"WeightPageContentViewController"];
        weightPageContentViewController.tableText = self.pageTables[index];
        weightPageContentViewController.titleText = self.pageTitles[index];
        weightPageContentViewController.pageIndex = index;
        return weightPageContentViewController;
    }
}
5
Hugo 31 Дек 2013 в 14:49

2 ответа

Лучший ответ

Каждый раз, когда ориентация меняется, вам нужно снова установить контроллер представления

WeightPageContentViewController *startingViewController = [self viewControllerAtIndex:currentViewControllerIndex];
NSArray *viewControllers = @[startingViewController];
[self.weightPageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
7
Jay Gajjar 31 Дек 2013 в 11:37

Для меня сработало это простое решение:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [self.pageController.view setNeedsLayout];
}
2
electronix384128 25 Фев 2015 в 21:34