iPhone - UIViewController не вращается при изменении ориентации устройства - PullRequest
14 голосов
/ 11 января 2009

У меня есть свой собственный пользовательский 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 не вызывается, и изображение, похоже, не вращается само по себе ... Может ли кто-нибудь указать, что мне нужно добавить или что я здесь не так сделал?

Заранее спасибо!

Ответы [ 9 ]

26 голосов
/ 12 ноября 2009

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

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

3 голосов
/ 11 января 2009

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

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

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

1 голос
/ 27 января 2011

Это обсуждается в Технических вопросах и ответах Apple QA1688 .

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

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

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

[self.view removeFromSuperview];
AppDelegate *dg = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[[dg window] addSubview:[[dg viewController] view]]; 
1 голос
/ 12 января 2009

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

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

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

1 голос
/ 11 января 2009

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

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

, а также layoutSubviews

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

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

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

0 голосов
/ 28 апреля 2012

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
0 голосов
/ 07 декабря 2011

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

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

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

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

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

0 голосов
/ 13 апреля 2011

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

    m_timerViewController = [TimerViewController alloc];

вместо

    m_timerViewController = [[TimerViewController alloc] init];
0 голосов
/ 31 декабря 2010

Я скопировал это с по этой ссылке

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

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

@implementation MyTabBarController: UIViewController {}
@end

что-то вроде этого

@implementation MyTabBarController: UITabBarController{

}

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...