2014-10-25 1 views
1

Содержимое приложения не вращается, если я использую UINavigationController в своем приложении. Изменяется только ориентация состояния.Содержимое не вращается, если я использую UINavigationController

Это мой метод didFinishLaunchingWithOptions.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 


    UIStoryboard* sb = [UIStoryboard storyboardWithName:@"Main" 
               bundle:nil]; 
    SpecificViewController *control=[sb instantiateViewControllerWithIdentifier:@"specific"]; 
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:control]; 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [self.window setRootViewController:navigationController]; 

    return YES; 
} 

Я не понимаю, почему я получаю этот результат.

enter image description here

НАЙДЕНО IT

Наконец, я нашел решение. Но я не понимаю, почему.

это мой сделалFinishLaunchingWithOptions способ.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 

    self.window.rootViewController =nil; 
    UIStoryboard* sb = [UIStoryboard storyboardWithName:@"Main" 
               bundle:nil]; 
    SpecificViewController *control=[sb instantiateViewControllerWithIdentifier:@"specific"]; 
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:control]; 

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [self.window setRootViewController:navigationController]; 

    return YES; 
} 

И это метод viewDidLoad SpecificViewController.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; 
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; 

    [email protected]"The Title"; 

} 

И я установил свойство «Просмотр состояния на основе контроллера на основе контроллера» в NO в файле plist. Сейчас он работает, но я не понимаю, что все это значит и почему.

+0

Вам не хватает '[self.window makeKeyAndVisible];' в вашей реализации 'doneFinishLaunchingWithOptions'. –

ответ

1

Это работает для меня, попробуйте:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    UIStoryboard* sb = [UIStoryboard storyboardWithName:@"Main" 
               bundle:nil]; 
    SpecificViewController *control=[sb instantiateViewControllerWithIdentifier:@"specific"]; 
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:control]; 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [self.window setRootViewController:navigationController]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

добавить это SpecificViewController.m

- (BOOL)prefersStatusBarHidden 
{ 
    return NO; 
} 

набор "Вид контроллера на основе строки состояния внешнего вида" свойство YES и удалить "Main" из Основные параметры интерфейса. Вам не нужно использовать метод setStatusBarHidden.

2

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

Причина вращения не работала, потому что вы используете раскадровки, которые автоматически создают UIWindow. Затем в вашем приложении didFinishLaunching вы выделяете новый UIWindow. Только первый UIWindow (созданный вашей раскадройкой) получит уведомления о ротации, поэтому вы только заметили, что строка состояния вращается, а не ваши представления.

Решение удалить следующие строки из метода didFinishLaunchingWithOptions:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
[self.window setRootViewController:navigationController]; 

Ваш RootViewController также будет установлен в раскадровке, нет необходимости устанавливать его снова в коде.