IPhone - UIViewController не вращается при изменении ориентации устройства

У меня есть собственный пользовательский UIViewController, который содержит UIScrollView с UIImageView по мере его просмотра. Я бы хотел, чтобы изображение автоматически поворачивалось, когда меняется ориентация устройства, но он, похоже, не работает...

В файле заголовка у меня есть:

@interface MyViewController : UIViewController <UIScrollViewDelegate> {
    IBOutlet UIScrollView   *containerView;
    UIImageView *imageView;
}

Эти компоненты инициализируются в функции loadView, как показано ниже:

    containerView = [[UIScrollView alloc] initWithFrame:frame];

    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://..."]];
    UIImage *image = [[UIImage alloc] initWithData:data];
    imageView = [[UIImageView alloc] initWithImage:image];
    [image release];

    [containerView addSubview:imageView];

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

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

MyViewController загружается отлично с изображением, которое я указал, чтобы захватить URL-адрес, и функция shouldAutorotate... вызывается с правильной UIInterfaceOrientation, когда я переворачиваю устройство тоже.

Однако метод didRotateFromInterfaceOrientation не вызывается, и изображение, похоже, не вращается... Может ли кто-нибудь указать, что мне нужно добавить, или что я сделал здесь неправильно?

Спасибо заранее!

Ответы

Ответ 1

Это не может быть правильным ответом для вас, потому что вы не указываете контекст, в котором находится UIViewController, но я только что нашел важную информацию в документации Apple, которая объясняет аналогичную проблему, с которой я столкнулся.

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

Ответ 2

Я заметил, что при вращении UIView возникают проблемы, которые не являются первым или единственным видом в качестве прямого дочернего элемента главного окна.

Итак, если ваш UIView является частью контроллера навигации или контроллера табуляции, вам также необходимо переопределить функцию shouldAutoRotateToInterfaceOrientation на контроллере навигации или в контроллере табуляции.

Также: использование [UIApplication setStatusBarOrientation] помогает обойти вещи, если/когда вам нужно сделать это вручную.

Ответ 3

Чтобы сделать это в моем приложении, мне пришлось переопределить

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    [self layoutSubviews];
}

а также layoutSubviews

- (void)layoutSubviews
{
    NSLog(@"layoutSubviews called");

    ...recalc rects etc based on the new self.view.bounds...
}

Я не уверен, что это абсолютно необходимо, но это сработало для меня.

Ответ 4

Иногда, если вы добавляете subview в представление, ваша ответственность - убедиться, что методы переданы в subview; пару дней назад я написал короткую статью об этом. Например, если у вас есть UIViewController и добавьте UINavigationController как subview, вы должны добавить этот код в UIViewController, если вы хотите, чтобы viewWillAppear:animated: вызывался при появлении UINavigationController.view:

-(void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated];
[projectNavigationController viewWillAppear:animated];
}

Возможно, что метод willRotateToInterfaceOrientation и didRotateFromInterfaceOrientation также должен быть вызван супервидом; Я не уверен в этом, но дайте ему попробовать.

Ответ 5

Это обсуждается в Apple Technical Q & A QA1688.

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

[myWindow addSubview:primaryViewController.view];
[myWindow addSubview:anotherController.view];

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

[self.view removeFromSuperview];
AppDelegate *dg = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[[dg window] addSubview:[[dg viewController] view]]; 

Ответ 6

Я скопировал это из эту ссылку

И это работает для меня.... Причина, почему я добавил это здесь, - это облегчить поиск другими. Мне потребовалось много часов, чтобы найти это исправление:

Создайте новый набор файлов классов типа UIViewController, перейдите в файл .h этого класса и измените эту строку

@implementation MyTabBarController: UIViewController {}
@end

к чему-то вроде этого

@implementation MyTabBarController: UITabBarController{

}

Теперь зайдите в файл nib и щелкните объект UITabBarController и перейдите на вкладку идентификации и сделайте его Class MyTabBarController.

теперь в MyTabBarController.m убедитесь, что он в нем.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)io {
     return YES;
}

Вы можете, возможно, избавиться от всего остального там, если хотите.

Ответ 7

Я только что наткнулся на это, имея аналогичную проблему. У меня есть серия контроллеров/сложных представлений, которые все отлично вращаются и не могут понять, почему новый, который я только что добавил, не вращался. После много проб и ошибок причина заключалась в том, что я не вызывал метод init (это стандартный метод init) при распределении контроллера вида; например Я делал

    m_timerViewController = [TimerViewController alloc];

вместо

    m_timerViewController = [[TimerViewController alloc] init];

Ответ 8

Чтобы перейти на пост jonoogle. У меня была аналогичная ошибка. У моего представления есть nib и мой пользовательский init:

- (id)initWithCategory:(Category *)category inManagedObjectContext:context{

не включал вызов для инициализации ниба.

self = [super initWithNibName:nil bundle:nil];

Добавление этой строки заставило мое представление вращаться, как и предполагалось.

Ответ 9

просто сделайте это, если вы хотите повернуть от пейзажа к портрету!

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}