Paisaje xib aparece como retrato

Tengo un controlador de vista y archivos de punta separados para retrato y paisaje. Al girar, cargo el plumín respectivo. Los métodos

 shouldAutorotateToInterfaceOrientation and willRotateToInterfaceOrientation

me llaman y el plumín cambia.

El problema:

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.)

Uno pensaría que el problema radica en no establecer la orientación como Horizontal en IB Métricas simuladas para la vista, pero lo hice y la vista aparece como horizontal en IB. (No creo que sea posible crear un botón rotado como ese si la vista fuera vertical). Además de estas dos puntas, tengo una ventanaprincipal.xib, que contiene los objetos delegado de aplicación, ventana y controlador de vista.

EDITAR: Me di cuenta de que las vistas en realidad están girando, cuando deberían "permanecer arriba". Es como si hubiera una transformación extra. Cuando giro el teléfono 90° a la derecha, el xib horizontal se muestra girado 90° a la derecha. Cuando giro el teléfono otros 90° a la derecha, la xib vertical se muestra al revés. La barra de estado siempre se muestra correctamente en la parte superior.

EDIT2: Usando

self.view.transform = CGAffineTransformMakeRotation((M_PI * (90) / 180.0));

en willRotateToInterfaceOrientation puedo rotar la vista a la izquierda horizontal (y a cualquier orientación que desee), así que puedo usar eso como una solución alternativa. Sin embargo, tengo otros proyectos en los que la vista gira automáticamente y no requiere el uso de CGaffineTransformMakeRotation. Es como si algo estuviera impidiendo la rotación automática aquí.

preguntado el 28 de agosto de 12 a las 11:08

En tu paisaje xib, ¿estableciste la orientación como paisaje? Si es así, cámbielo a retrato. -

Lo he puesto en paisaje. Sí, he intentado ponerlo en modo retrato, ¡pero sigue apareciendo de la misma manera! -

In shouldAutorotateToInterfaceOrientation, return YES; Además, en su proyecto Objetivos-> Resumen, asegúrese de haber establecido las orientaciones admitidas:

Por supuesto. La barra de estado no rotaría si la orientación horizontal no fuera compatible. -

Esto no hizo ninguna diferencia. -

2 Respuestas

¿Estás agregando el view cargado desde nib como subView? Si Solo la barra de estado está girando, significa que su la vista anterior esta colgada mientras libera la vista y agrega la nueva vista. ¿Puede decir cómo está agregando la vista cargada desde xib al SuperView.

Asegúrese de que está liberando el vista previa correctamente mientras carga la otra vista, ponga NSLOG en dealloc de las vistas y verifique si la vista se libera por completo.

Respondido 28 ago 12, 11:08

No estoy liberando ya que estoy usando ARC. En willRotateToInterfaceOrientation del controlador de vista, estoy cargando el nuevo plumín como: UINib *nib = [UINib nibWithNibName:@"landscapetest" bundle:nil]; UIView *landscapeView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; self.vista = vista del paisaje; - james0n

Había hecho algo similar a esto solo que en lugar de crear un archivo de punta por separado, solo agregué dos subvistas a la punta principal como prtraitView y Landscape View

y los cambié de la siguiente manera

En el método 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];


}

y luego Implementé deviceOrientationDidChangeNotification de la siguiente manera

- (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];
        }
    }



}

me funciono muy bien..

Respondido 24 Jul 14, 06:07

Gracias, intentaré esto más tarde. Parece prometedor. (Pero sigue siendo una solución a un problema que no debería necesitar trabajo adicional). - james0n

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.