Обработка изменения ориентации на iPad с одним UIViewController и двумя XIB - PullRequest
9 голосов
/ 19 ноября 2010

Я бы хотел обработать изменение ориентации в приложении iPad с одним UIViewController и двумя XIB, скажем, MenuView и MenuViewLandscape.

Итак, в методе willRotateToInterfaceOrientation объекта MenuViewController, как я могу изменить XIB безиспользовать другой контроллер для ландшафтного режима?

Я использую следующий код:

if( toInterfaceOrientation != UIInterfaceOrientationPortrait ){
    MenuViewController *landscape = [[MenuViewController alloc] 
                                        initWithNibName: @"MenuViewLandscape"
                                        bundle:nil 
                                    ];        
    [self setView:landscape.view];
}
else {
    MenuViewController *potrait = [[MenuViewController alloc] 
                                     initWithNibName: @"MenuView"
                                     bundle:nil 
                                  ];        
    [self setView:potrait.view];
}

Но когда я перехожу в альбомную ориентацию XIB, элементы управления альбомной ориентацией поворачиваются неправильно.

Ответы [ 2 ]

12 голосов
/ 21 ноября 2010

Я не уверен, что есть какие-то странные побочные эффекты с этой реализацией, но попробуйте что-то вроде этого и посмотрите, работает ли он для вас:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {
    if (UIInterfaceOrientationIsPortrait(orientation)) {
        [[NSBundle mainBundle] loadNibNamed:@"MenuView" owner:self options:nil];
        if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
            self.view.transform = CGAffineTransformMakeRotation(M_PI);
        }
    } else if (UIInterfaceOrientationIsLandscape(orientation)){
        [[NSBundle mainBundle] loadNibNamed:@"MenuViewLandscape" owner:self options:nil];
        if (orientation == UIInterfaceOrientationLandscapeLeft) {
            self.view.transform = CGAffineTransformMakeRotation(M_PI + M_PI_2);
        } else {
            self.view.transform = CGAffineTransformMakeRotation(M_PI_2);
        }
    }
}

Это предполагает, что Владелец файла в вашем MenuViewи MenuViewLandscape XIBs оба установлены в MenuViewController, и что выходное представление установлено также в обеих XIBs.Все ваши розетки должны быть правильно подключены по очереди при использовании loadNibNamed.

Если вы создаете для iOS 4, вы также можете заменить строки loadNibNamed на эти:

UINib *nib = [UINib nibWithNibName:@"MenuView" bundle:nil];
UIView *portraitView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
self.view = portraitView;

и

UINib *nib = [UINib nibWithNibName:@"MenuViewLandscape" bundle:nil];
UIView *landscapeView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
self.view = landscapeView;

Они предполагают, что UIViewто, что вы хотите отобразить, следует сразу за прокси-объектами «Владелец файла» и «Первый ответчик» в XIB.

Тогда вам просто нужно убедиться, что представления повернуты правильно для ориентации интерфейса.Для всех видов, которые не имеют книжной ориентации по умолчанию, поверните их, установив свойство transform вида и используя CGAffineTransformMakeRotation() с соответствующими значениями, как показано в примере выше.

Одна только ротация может решить вашу проблему без дополнительной загрузки NIB.Однако загрузка целого нового экземпляра MenuViewController и установка его представления в существующее представление MenuViewController может привести к некоторому странному поведению с событиями жизненного цикла и вращения, так что вам может быть безопаснее попробовать приведенные выше примеры.Они также избавляют вас от необходимости создавать MenuViewController экземпляров, когда вам нужен только вид из них.

Надеюсь, это поможет!

Джастин

1 голос
/ 29 марта 2012

Возможно, ответ от Джона Родригеса здесь сделает то, что вы хотите:

Хотите использовать несколько перьев для разных ориентаций интерфейса iphone

Если у вас есть два класса UIViewControllerбазовый класс для портретного режима и его подкласс для ландшафтного режима, вы можете поместить почти весь код в базовый класс.Так что это дает вам большинство преимуществ одного класса контроллера представления, а также позволяет использовать другие решения, подобные этому:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...