#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.