UITabBarController заставляет вращаться при переключении вида - PullRequest
0 голосов
/ 14 марта 2012

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

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

Мне было интересно, может ли кто-нибудь сказать мне, как заставить вращение при смене вида, поэтому, когда я переключаюсь в альбомную ориентацию, он сразу же поворачивается в эту ориентацию?

Извините, если этоменя уже миллион раз спрашивали, но я не могу найти темы.

РЕДАКТИРОВАТЬ, Я НАШЕЛ СЛЕДУЮЩИЙ КОД:

UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

Это действительно работаетвращение, но я не уверен, где его вызывать, поскольку контроллер панели вкладок не вызывает такие вещи, как init / viewDidLoad, очевидно, что помещение его в viewDidAppear и т. д. вызовет бесконечный цикл.

Любая помощь по этому вопросу, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

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

Сначала добавьте UITabBarControllerDelegate в ваши протоколы, в которых создается TabBarController.используя AppDelegate, сделайте следующее:

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>

Это позволяет получить доступ к следующему протоколу TabBar:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController

В основном это вызывается всякий раз, когда нажимается одна из TabBarItems (кнопки вдольниз).В рамках этой функции я извлекаю имя viewControllerNibFile, так как они названы так (вы, вероятно, можете использовать view.tag, если вы не хотите беспокоиться о соглашениях об именах), и публикуете событие в центр уведомлений следующим образом.:

NSString *notificationName;

if ([viewController.nibName isEqualToString:@"IntroViewController"])
    notificationName = [NSString stringWithString:@"IntroViewChange"];

NSLog(@"%@", notificationName);
[[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:nil];

Затем я настраиваю слушателя в классе, который вызывает следующее событие:

- (void)updateViewRotation
{
    UIViewController *c = [[UIViewController alloc]init];
    [self presentModalViewController:c animated:NO];
    [self dismissModalViewControllerAnimated:NO];
    [c release];
}

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

2 голосов
/ 06 марта 2013

@ Эллиот, я дал вам ответ за ваш ответ, потому что он работает лучше, чем любое другое решение, которое я пробовал, но вот упрощение. Вместо того, чтобы использовать уведомление, просто поместите это в didSelectViewController:

if ( [viewController respondsToSelector:@selector(updateViewRotation)] ) {
     [viewController performSelector:@selector(updateViewRotation)];
}

Это работает, только если viewController, нуждающийся в этом особом внимании, является первым на вкладке.

Также обновление для iOS 6 устарело:

- (void)updateViewRotation
{
    UIViewController *vc = [[UIViewController alloc] init];
    [self presentViewController:vc animated:NO completion:nil];
    [self dismissViewControllerAnimated:NO completion:nil];
}
...