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);
}