Вопросы вращения UITabBarController в ios 6
Ack! У меня были проблемы с вращением на вкладке, которые были разрешены, наконец, в iOS 5, но iOS 6 и xcode, похоже, сломали вещи... вот что я имею:
Целевая информация о приложении включает в себя: Поддерживаемые интерфейсные ориентации - Портреты, Пейзаж слева, Пейзаж справа
Каждый Single View в приложении имеет следующие методы:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
return ((interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown) &&
(interfaceOrientation != UIInterfaceOrientationLandscapeLeft) &&
(interfaceOrientation != UIInterfaceOrientationLandscapeRight));
} else {
return YES;
}
}
- (BOOL)shouldAutorotate
{
NSLog(@"am I called1?");
return NO;
}
-(NSUInteger)supportedInterfaceOrientations{
NSLog(@"am I called?");
return UIInterfaceOrientationMaskPortrait;
}
В представлениях, которые не являются частью панели вкладок, вращение блокируется. Во ВСЕХ представлениях на вкладке (есть 5) приложение никогда не вызывает ShouldAutorotate и поэтому вращается. Кажется, он поддерживается .InterfaceOrientations вызывается один раз при загрузке представления, но не тогда, когда он появляется, если я переключаюсь между представлениями, потому что я получаю NSLog, но, похоже, игнорирует параметр MaskPortrait.
Мне нужно оставить пейзаж включенным в цель, потому что у меня есть один просмотр видеоплеера, который нужно вращать (и он делает это, отлично)
Является ли это ошибкой на вкладке в iOS 6? Нужно ли мне отключать вращение просмотров по-разному? В авторизованном интерфейсе ориентация работала отлично в ios 5
Я был на нем какое-то время
Спасибо,
Zack
Ответы
Ответ 1
Зак, я столкнулся с этой проблемой. Это связано с тем, что у вас есть viewController, встроенный внутри контроллера TabBar или UINavigationController, и вызовы этих методов происходят внутри них вместо обычного View (измененного в iOS6).
Я столкнулся с этой проблемой, потому что я представлял viewController, встроенный внутри UINavigationController, во все мои модальные представления, в которых была Навигация для разных просмотров (процесс регистрации, вход и т.д.).
Мое простое исправление заключалось в создании CATEGORY для UINavigationController, который включает в себя эти два метода. Мне нужно, чтобы Autorotate возвращал NO, потому что я не хочу, чтобы мои модальные представления вращались. Ваше исправление может быть таким простым, попробуйте. Надеюсь, что это поможет.
Я создал категорию и назвал ее autoRotate и выбрал опциюUINavigationController. Файл M + H находится ниже.
#import "UINavigationController+autoRotate.h"
@implementation UINavigationController (autoRotate)
-(BOOL)shouldAutorotate {
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
@end
... и категория .h:
#import <UIKit/UIKit.h>
@interface UINavigationController (autoRotate)
-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;
@end
Ответ 2
Если у вас есть панель вкладок, как я, единственное, что вам нужно сделать, это добавить следующее в файл делегата .m,
#import "AppDelegate.h"
//UITabBarController category to set the view rotations for ios 6
@implementation UITabBarController (Background)
-(BOOL)shouldAutorotate
{
//I don't want to support auto rotate, but you can return any value you want here
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
//I want to only support portrait mode
return UIInterfaceOrientationMaskPortrait;
}
@end
/////here starts the implementation of the app delegate which is gonna be whatever you currently have on your .m delegate
@implementation AppDelegate
// delegate methods and other stuff
@end
Ответ 3
У меня также возникла проблема в том, что мне нужны некоторые виды для вращения, а другие - не с несколькими навигационными контроллерами. Я сделал это, указав навигационному контроллеру посмотреть в контроллере представления. Вот что я сделал.
Я создаю класс UINavigationController, называемый RootNavigationController, и назначил этот класс как пользовательский класс для навигационных контроллеров в раскадровке. В RootNavigationController.m я добавил следующие методы:
- (BOOL)shouldAutorotate {
return [self.visibleViewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations {
return [self.visibleViewController supportedInterfaceOrientations];
}
В каждом файле контроллера .m файл я также добавил следующие методы.
- (BOOL)shouldAutorotate {
//return yes or no
}
- (NSUInteger)supportedInterfaceOrientations{
//return supported orientation masks
}
Это позволяет мне настроить ориентацию для каждого вида в своем контроллере вида.
Работал для меня в любом случае...
Ответ 4
Моя ситуация:
- UITabBarController имеет 2 элемента: 2 Контроллер навигации
- UINavigationController1 withRootView: ViewController1
- UINavigationController2 withRootView: ViewController2.
- Теперь я хочу, чтобы ViewController1 установил shouldAutorotate: NO/maskPortrait и
ViewController2 set shouldAutorotate/MaskAll.
Итак, мой инструмент: Создать категорию UITabBarController и категорию UINavigationCntroller, например
UITabBarController + autoRotate.h
@interface UITabBarController (autoRotate)
-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;
@end
UITabBarController + autoRotate.m
#import "UITabBarController+autoRotate.h"
@implementation UITabBarController (autoRotate)
- (BOOL)shouldAutorotate {
return [self.selectedViewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations {
return [self.selectedViewController supportedInterfaceOrientations];
}
@end
UINavigationController + autoRotate.h
@interface UINavigationController (autoRotate)
-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;
@end
UINavigationController + autoRotate.m
@implementation UINavigationController (autoRotate)
- (BOOL)shouldAutorotate {
return [self.visibleViewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations {
return [self.visibleViewController supportedInterfaceOrientations];
}
@end
UIViewController1.m
- (BOOL)shouldAutorotate {
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;;
}
UIViewController2.m
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
Он работал как шарм!
Ответ 5
В моем случае у меня был контроллер навигации, встроенный в UITabBarController, и то, что работало, создавало такую категорию, как Kunani, но расширило UITabBarController вместо UINavigationController. Он работал как шарм:)
#import "UINavigationController+autoRotate.h"
@implementation UINavigationController (autoRotate)
-(BOOL)shouldAutorotate {
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
@end
И .h файл:
#import <UIKit/UIKit.h>
@interface UINavigationController (autoRotate)
-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;
@end
Ответ 6
Это будет сделано в Swift
extension UITabBarController {
public override func shouldAutorotate() -> Bool {
if let selected = self.selectedViewController {
return selected.shouldAutorotate()
} else {
return false
}
}
public override func supportedInterfaceOrientations() -> Int {
if let selected = self.selectedViewController {
return selected.supportedInterfaceOrientations()
} else {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
}
}
extension UINavigationController {
public override func shouldAutorotate() -> Bool {
return self.visibleViewController.shouldAutorotate()
}
public override func supportedInterfaceOrientations() -> Int {
return self.visibleViewController.supportedInterfaceOrientations()
}
}
Ответ 7
fooobar.com/questions/97480/...
при обработке этой ситуации возникает много неоднозначных или непредвиденных результатов, особенно когда речь заходит о поддержании ориентации только для определенного контроллера вида и не для остальной части приложения. этот алгоритм, кажется, вручает мне все
fooobar.com/questions/97480/...
Ответ 8
Вы должны добавить эту вещь в UIViewController1.m
, чтобы убедиться, что предыдущий статус ориентации восстановлен:
(void)viewDidAppear:(BOOL)animated
{
[[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:")
withObject:(id)UIInterfaceOrientationPortrait];
}
Perfect!