¿Cómo restringir la autorrotación a una orientación única para algunas vistas, mientras se permiten todas las orientaciones en otras?

Esta pregunta es sobre la rotación de dispositivos iOS y múltiples vistas controladas en un UINavigationController. Algunas vistas deberían ser limitado al retrato orientación, y algunos deberíanautorotate libremente. Si intenta crear la configuración más simple con tres vistas, notará que el comportamiento de autorrotación tiene algunas peculiaridades muy desagradables. Sin embargo, el escenario es muy simple, así que creo que no estoy haciendo la implementación de autorrotación correctamente o me estoy olvidando de algo.

Tengo una aplicación de demostración muy básica que muestra la rareza e hice un video que la muestra en acción.

Descargue la aplicación (proyecto XCode) Vea las clases como una esencia (bastante larga)Vea el video de la pregunta (YouTube, 2m43s)

La configuración es muy básica: tres controladores de vista llamadosFirstViewController, SecondViewController yThirdViewController todos extienden unAbstractViewController que muestra una etiqueta con el nombre de la clase y que devuelve SÍ parashouldAutorotateToInterfaceOrientation: cuando el dispositivo está en orientación vertical. SecondViewController anula este método para permitir todas las rotaciones. Las tres clases concretas agregan algunos cuadrados de colores para poder navegar entre las vistas presionando y colocando los controladores dentro / fuera de laUINavigationController. Hasta ahora, un escenario muy simple, diría.

Si sostiene el dispositivo en orientación vertical u horizontal, este es el resultado que no solo me gustaría lograr, sino que también esperaría. En la primera imagen, verá que todas las vistas son 'verticales', y en la segunda verá que solo el segundo controlador de vista gira en sentido contrario la orientación del dispositivo. Para ser claros, debería ser posible navegar desde la segunda vista en modo horizontal a la tercera, pero debido a que esa tercera solo admite la orientación vertical, solo debe mostrarse en orientación vertical. La forma más fácil de ver si los resultados están bien es mirar la posición de la barra de soporte.

Pero esta pregunta está aquí porque el resultado real es completamente diferente. Según la vista en la que se encuentre cuando gire el dispositivo, y según la vista a la que navegue a continuación, las vistas no rotarán (para ser específicos, eldidOrientFromInterfaceOrientation: método nunca se llama). Si está en horizontal en el segundo y navega hacia el tercero, tendrá la misma orientación que el segundo (= malo). Sin embargo, si navega desde el segundo hasta el primero, la pantalla girará a un modo de retrato 'forzado', y la barra de soporte estará en la parte superior física del dispositivo, independientemente de cómo lo sostenga. El video muestra esto con más detalle.

Mi pregunta es doble:

¿Por qué el primer controlador de vista gira hacia atrás, pero no el tercero? ¿Qué debe hacerse para obtener el comportamiento correcto de sus vistas cuando solo desea que algunas vistas se autorregulen, pero no otras?

Cheers, EP.

EDIT: Como último recurso antes de ponerle una recompensa, reescribí por completo esta pregunta para que sea más corta, más clara y, con suerte, más atractiva para dar una respuesta.

Respuestas a la pregunta(5)

Su respuesta a la pregunta