Авторизовать один UIViewController в iOS 6 с UITabBar
У меня есть приложение, которое работает только в Portrait Mode
, но есть singleView, который может отображать видео, поэтому я хочу, чтобы этот просмотр работал и в landscape mode
, но в iOS 6 я не могу понять, как я может это сделать, теперь у меня есть это:
В AppDelegate.m у меня есть:
self.window.rootViewController = myTabBar;
то в Сводке проекта:
![enter image description here]()
и я обнаружил, что в iOS 6 для обнаружения вращения просмотра я должен сделать это:
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
// Tell the system It should autorotate
- (BOOL) shouldAutorotate {
return YES;
}
поэтому я вставляю код выше только в мой UIViewController
, который я хочу использовать также в ландшафте, но не работаю, кто-нибудь знает, как я могу это сделать? Я просто хочу авторотировать, когда показываю видео.
Ответы
Ответ 1
Во-первых, ваши целевые настройки должны выглядеть так:
![Supported Interface Orientations]()
В UITabBarController:
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// You do not need this method if you are not supporting earlier iOS Versions
return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
-(NSUInteger)supportedInterfaceOrientations
{
if (self.selectedViewController)
return [self.selectedViewController supportedInterfaceOrientations];
return UIInterfaceOrientationMaskPortrait;
}
-(BOOL)shouldAutorotate
{
return YES;
}
Внутри ViewController:
a) если вы не хотите вращать:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (BOOL)shouldAutorotate
{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
b), если вы хотите повернуть на пейзаж:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
Edit:
Другое решение - реализовать этот метод внутри AppDelegate:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
NSUInteger orientations = UIInterfaceOrientationMaskAll;
if (self.window.rootViewController) {
UIViewController* presented = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
orientations = [presented supportedInterfaceOrientations];
}
return orientations;
}
Ответ 2
Я бы написал комментарий, но не могу, поэтому я отправляю это как ответ.
Это был мой сценарий:
Мое приложение поддерживает изменение ориентации только на определенные виды, и я не мог понять, как это сделать только для тех, которые я хотел, затем я приземлился на этот вопрос и увидел ответ mientus (спасибо за это), тогда я пошел дальше и сделал то, что он предложил, который был подклассом UITabBarController, и переопределить эти методы:
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
NSLog(@"AUTO ROTATE IN CUSTOM TAB BAR");
// You do not need this method if you are not supporting earlier iOS Versions
return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
-(NSUInteger)supportedInterfaceOrientations{
NSLog(@"supportedInterfaceOrientations IN CUSTOM TAB BAR");
if (self.selectedViewController)
return [self.selectedViewController supportedInterfaceOrientations];
return UIInterfaceOrientationMaskPortrait;
}
-(BOOL)shouldAutorotate{
NSLog(@"shouldAutorotate IN CUSTOM TAB BAR");
return [self.selectedViewController shouldAutorotate];
}
то внутри каждого контроллера представления у меня будут методы, чтобы указать, нужно ли мне вращение или нет. Методы в UITabBarController вызывались, но не те, что были в моем контроллере view, поэтому ротация все еще происходила там, где я этого не хотел. Затем я подклассифицирую UINavigationController и переопределяю те же методы только с этим изменением на поддерживаемомInterfaceOrientation, чтобы выглядеть следующим образом:
- (NSUInteger)supportedInterfaceOrientations{
NSLog(@"supportedInterfaceOrientations IN CUSTOM NAV BAR CALLING CURRENT VIEW CONTROLLER");
UIViewController* presented = [[self viewControllers] lastObject];
return [presented supportedInterfaceOrientations];
}
что это делает в основном, он получает текущий контроллер представления, а затем запрашивает поддерживаемую ориентацию и вуаля, и мои методы в моем диспетчере просмотра вызываются, и я могу обрабатывать ориентацию, где я хочу.
Ответ 3
Является ли представление, которое вы хотите повернуть подвью только для портрета? Обычно просмотр поведения вращения наследуется от rootviewcontroller. Затем, если вы вернете NO в shouldAutorotate в rootviewcontroller, вы остановите вращение в каждом отдельном недосмотре.
Я предлагаю разделить вашу архитектуру следующим образом:
rootViewController → supportedInterfaceOrientations = Portrait и shouldAutorotate = YES
NORotationViewControllers → supportedInterfaceOrientations = Portrait и shouldAutorotate = YES
rotationViewControllers → supportedInterfaceOrientations = All и shouldAutorotate = YES
Если вы еще не прочитали это, посмотрите:
Поддержка ориентации нескольких интерфейсов