Estoy escribiendo una aplicación para iPhone que (como la mayoría de las aplicaciones) admite rotación automática: rota el teléfono y sus vistas giran y cambian de tamaño de forma apropiada.iOS: titleView de la barra de navegación no cambia de tamaño correctamente cuando el teléfono gira
Pero estoy asignando una vista personalizada a navigationItem.titleView
(el área del título de la barra de navegación), y no puedo obtener esa vista para cambiar el tamaño correctamente cuando el teléfono gira.
Sé lo que estás pensando: "Simplemente establece su autoresizingMask
en UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
", pero no es tan simple. Por supuesto, si no configuro mi vista como autoresizingMask
, entonces mi vista no cambia de tamaño; y quiero que cambie el tamaño.
El problema es que si I establece autoresizingMask
, entonces cambia el tamaño correctamente siempre que esa vista esté visible; pero el tamaño titleView
se ensucia en este escenario:
- Ejecute la aplicación, con el teléfono en modo retrato. Todo se ve bien.
- Haga algo que haga que la aplicación presione otra vista en la pila de navegación. P.ej. haga clic en una fila o botón de la tabla que causa una llamada al
[self.navigationController pushViewController:someOtherViewController animated:YES]
. - Mientras ve el controlador para niños, gire el teléfono a horizontal.
- Haga clic en el botón "Atrás" para volver a la vista de nivel superior. En este punto, la vista del título está en mal estado: aunque está sosteniendo el teléfono en modo horizontal, la vista del título todavía está dimensionada como si la estuviera sosteniendo en modo vertical.
- Finalmente, gire el teléfono nuevamente al modo vertical. Ahora las cosas empeoran: la vista del título se reduce de tamaño (ya que la barra de navegación se hizo más pequeña), pero como ya era demasiado pequeña, ahora es demasiado demasiado pequeña.
Si desea reproducir este usted mismo, siga estos pasos (esto es un poco de trabajo):
- hacer una aplicación utilizando el asistente "Aplicación basada en la navegación" de Xcode.
- Configúrelo de modo que la vista de tabla de nivel superior tenga filas que, al hacer clic en ellas, inserte una vista de detalles en la pila de navegación.
incluir este código tanto en el controlador de vista de nivel superior y el controlador de la vista de detalle:
- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); }
Incluir este código en sólo el controlador de vista de nivel superior:
- (void)viewDidLoad { [super viewDidLoad]; // Create "Back" button UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Master" style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationItem.backBarButtonItem = backButton; [backButton release]; // Create title view UILabel* titleView = [[[UILabel alloc] initWithFrame:CGRectMake(0,0,500,38)] autorelease]; titleView.textAlignment = UITextAlignmentCenter; titleView.text = @"Watch this title view"; // If I leave the following line turned on, then resizing of the title view // messes up if I: // // 1. Start at the master view (which uses this title view) in portrait // 2. Navigate to the detail view // 3. Rotate the phone to landscape // 4. Navigate back to the master view // 5. Rotate the phone back to portrait // // On the other hand, if I remove the following line, then I get a different // problem: The title view doesn't resize as I want it to when I: // // 1. Start at the master view (which uses this title view) in portrait // 2. Rotate the phone to landscape titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.navigationItem.titleView = titleView; }
Finalmente , sigue mis pasos de repro.
Entonces ... ¿estoy haciendo algo mal? ¿Hay alguna manera de hacer que mi titleView cambie de tamaño siempre correctamente?
Tomó su código exactamente y me funciona muy bien, ¡gracias! – esilver
Podría ser demasiado tarde (de 4 a 5 años de edad), pero ¿puedo preguntar ... en AutoLayout ... todavía te pasa esto de "no redimensionar"? Estoy trabajando con Storyboards y UINavigationControllers, cuando establezco un título realmente largo (digamos ... 100 caracteres o más), al rotar el iPhone funciona bien, pero en algún momento simplemente mantiene el tamaño del paisaje para la vista del título cuando rotado a retrato. No se que hacer. Sin personalización (arrastrando Navcontroller + controlador de vista raíz sin clases personalizadas) esto todavía está sucediendo. Me está volviendo loco, parece un error de iOS ... –