Только первый добавленный вид UIView addSubview показывает правильную ориентацию

У меня есть три ViewController, настроенные для обработки трех представлений. Проблема, с которой я столкнулся, заключается в том, что в симуляторе ориентация - это LandscapeRight (именно это я и хочу), и первое представление корректно отображается в этом альбомном представлении, но когда я перехожу на второе и третье представления, они отображаются повернут на 90 градусов против часовой стрелки с верхним левым углом обзора в левом нижнем углу экрана телефона. Я пытался отладить это в течение нескольких дней, и самое близкое, что я получил к подсказке, - это трассировка следующим образом:

Следующее находится в applicationDidFinishLaunching моего делегата приложения:

NSLog(@"1");
[window addSubview:welcomeController.view];
NSLog(@"2");
[window addSubview:goalController.view];
NSLog(@"3");
[window addSubview:planningController.view];
NSLog(@"4");

[window bringSubviewToFront:welcomeController.view];
NSLog(@"5");

Каждый из моих ViewControllers реализует что-то похожее на следующее (единственное изменение - имя контроллера, переключаемое в строке, переданной NSLog):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
NSLog(@"called for WelcomeController");
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

С этим я получаю следующий вывод на консоли:

a
called for WelcomeController
called for WelcomeController
called for WelcomeController
called for WelcomeController
2
called for GoalController
3
called for PlanningController
4
5

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

Я изменил порядок так, чтобы addSubview сначала вызывался для goalController, а потом - welcomeController. В данном случае это goalController, который отображается в правильной альбомной ориентации (обычно это приветственный контроллер). Это могло бы устранить мои файлы XIB и сами ViewControllers. Я не уверен, почему первое представление, где вызывается addSubview, является особенным. Я также попытался использовать insertSubview с индексом 0 с теми же результатами.

4 ответа

Столкнулся с той же проблемой, и, видимо, добавив подпредставления к UIWindow не работает так, как я ожидал. Мне удалось решить проблему после добавления "пустышки" UIViewController это единственное подпредставление в UIWindow. После добавления этого он отлично работает для добавления нескольких подпредставлений в фиктивный контроллер, все с правильной ориентацией.

Таким образом, единственный код в "фиктивном" классе контроллера - это "shouldAutorotateToInterfaceOrientationmsgstr "функция. Это также должно соответствовать той же функции во всех других подпредставлениях.

Надеюсь, поможет.

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

[window addSubview:firstController.view];
[window addSubview:secondController.view];
CGAffineTransform rotate = CGAffineTransformMakeRotation(M_PI/2.0);
[backgroundViewController.view setTransform:rotate];
CGRect contentRect = CGRectMake(0, 0, 1024, 768); 
backgroundViewController.view.bounds = contentRect; 
[backgroundViewController.view setCenter:CGPointMake(768/2, 1024/2)];

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

[window addSubview:welcomeController.view];
[welcomeController.view removeFromSuperview];
[window addSubview:goalController.view];
[goalController.view removeFromSuperview];
[window addSubview:planningController.view];
[planningController.view removeFromSuperview];

[window addSubview:welcomeController.view];
[window addSubview:goalController.view];
[window addSubview:planningController.view];

Вроде работает, по крайней мере в симуляторе.

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

[planningController.view setFrame: CGRectMake (0, 0, 480, 300)];

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

Другие вопросы по тегам