TabBarController: ориентация представлений в разных ориентациях

#ios #objective-c #ios7 #uinavigationcontroller #uitabbarcontroller

#iOS #objective-c #ios7 #uinavigationcontroller #uitabbarcontroller

Вопрос:

У меня возникли проблемы с сохранением моей текущей ориентации представлений. В приведенной ниже настройке я смог заблокировать первый контроллер представления в портретном режиме, а второй viewcontroller — в альбомном или портретном. Однако, когда я добавляю второй навигационный контроллер / rootviewcontroller к контроллеру вкладок, все представления по всему проекту будут как альбомными, так и портретными. Это происходит независимо от того, реализую ли я один и тот же код в первом навигационном контроллере для второго навигационного контроллера или нет

Я хотел бы иметь возможность сохранять свои текущие ориентации контроллеров представления при добавлении дополнительного navcontroller> viewcontroller

У меня есть следующая настройка в раскадровке: введите описание изображения здесь

Это то, чего я пытаюсь достичь: введите описание изображения здесь

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

И вот методы для каждого из текущих контроллеров представления

TabViewController.m

 -(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
  

NavController.m

 -(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
  

Первый контроллер представления.m

 -(BOOL)shouldAutorotate

{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{

    return UIInterfaceOrientationPortrait;
}
  

Второй контроллер представления.m

 -(BOOL)shouldAutorotate

{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{

    return UIInterfaceOrientationLandscapeLeft;
}
  

Я был бы признателен за любую помощь в решении этой проблемы. Это стало проклятием моего существования

Ответ №1:

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

 – tabBarControllerSupportedInterfaceOrientations:
– tabBarControllerPreferredInterfaceOrientationForPresentation:
  

и

 – navigationControllerPreferredInterfaceOrientationForPresentation:
– navigationControllerSupportedInterfaceOrientations:
  

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