Пейзаж xib отображается как портрет
У меня есть контроллер просмотра и отдельные файлы nib для портрета и пейзажа. При вращении я загружаю соответствующий наконечник. Методы
shouldAutorotateToInterfaceOrientation and willRotateToInterfaceOrientation
вызывается, а nib изменяется.
Проблема:
the landscape nib does not appear as landscape, but portrait! The status bar is
correctly rotated and appears on the top:
(Sorry, couldn't paste the image, because my account is new. The screenshot is in
landscape, with a landscape status bar, but a landscape view shown as portrait.)
Можно подумать, что проблема заключается в том, что вы не устанавливаете ориентацию как ландшафт в IB. Имитированные показатели для представления, но я это сделал, и представление выглядит как ландшафт в IB. (Я не думаю, что было бы возможно создать такую вращающуюся кнопку, если бы представление было портретом.) Помимо этих двух перьев у меня есть mainwindow.xib, который содержит делегат приложения, окно и просмотреть объекты контроллера.
EDIT: Я понял, что взгляды на самом деле вращаются, когда они должны "не спать". Это похоже на дополнительную трансформацию. Когда я поворачиваю телефон на 90 ° вправо, пейзаж xib отображается повернутым на 90 ° вправо. Когда я поворачиваю телефон на 90 ° вправо, изображение xib отображается вверх ногами. Строка состояния всегда отображается правильно вверху.
EDIT2: Использование
self.view.transform = CGAffineTransformMakeRotation((M_PI * (90) / 180.0));
in willRotateToInterfaceOrientation Я могу повернуть вид влево (и любой ориентации), поэтому я могу использовать это как обходной путь. Однако у меня есть другие проекты, в которых представление автоматически поворачивается и не требует использования CGAffineTransformMakeRotation. Это как-то предотвращает автоматическое вращение здесь.
Ответы
Ответ 1
Вы добавляете view
, загруженный из nib в качестве подвид? Если только строка состояния вращается, это означает, что ваш предыдущий вид висит, отпуская представление и добавляя новое представление. Можете ли вы рассказать, как вы добавляете представление, загруженное из xib
в SuperView.
Убедитесь, что вы правильно освобождаете предыдущий вид при загрузке другого представления, поместите NSLOG
в dealloc представлений и проверьте, полностью ли выпущено представление.
Ответ 2
Я сделал что-то похожее на это только вместо того, чтобы сделать файл nib отдельно. Я просто добавил два подзапроса к основному nib как prtraitView и Landscape View
и переключили их следующим образом
В режиме viewDidAppear
-(void)viewDidAppear:(BOOL)animated{
if(UIDeviceOrientationIsPortrait(self.interfaceOrientation))
{
self.portraitVIew.frame=self.view.bounds;
self.portraitVIew.frame=self.view.frame;
[self.view addSubview:self.portraitVIew];
}else{
self.landscapeView.frame=self.view.frame;
[self.view addSubview:self.landscapeView];
}
self.view.autoresizesSubviews = YES;
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(deviceOrientationDidChangeNotification:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
}
а затем Реализовано deviceOrientationDidChangeNotification следующим образом
- (void)deviceOrientationDidChangeNotification:(NSNotification*)note
{
if ([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad) {
}else{
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if(UIDeviceOrientationIsLandscape(self.interfaceOrientation))
{
self.landscapeView.hidden=NO;
self.landscapeView.frame=self.view.frame;
[self.portraitVIew removeFromSuperview];
[self.view addSubview:self.landscapeView];
}else {
self.landscapeView.hidden=YES;
self.portraitVIew.frame=self.view.frame;
NSLog(@"Portrait");
[self.view addSubview:self.portraitVIew];
}
}
}
Это сработало очень хорошо для меня..