Пейзаж 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];
        }
    }



}

Это сработало очень хорошо для меня..