Tengo una UIView que se supone que cubre todo el dispositivo (UIWindow) para apoyar una imagen de zoom in/out efecto yo estoy haciendo uso de core animation, donde el usuario pulsa un botón en un UITableViewCell y yo zoom de la imagen asociada.

El zoom se está realizando a la perfección, lo que no he sido capaz de averiguar es por qué la subvista todavía está en el modo de retrato, incluso aunque el dispositivo está en el paisaje. Una ilustración de abajo:

Orientación en un UIView añadido a un UIWindow

Tengo un controlador de navegación, pero este punto de vista ha sido añadido a la UIWindow directamente.

InformationsquelleAutor Ken | 2010-03-24

6 Comentarios

  1. 121

    Usted puede leer acerca de algunas de las posibles causas aquí:

    Técnica de la P&UN QA1688 – ¿por Qué no mi UIViewController girar con el dispositivo?

    En su situación probablemente el hecho de que usted está agregando a la vista como otra vista a la ventana. Sólo la primera subvista obtiene la rotación de eventos. Lo que puedes hacer es añadir una subvista de la primera ventana subvista.

    UIWindow* window = [UIApplication sharedApplication].keyWindow;
    if (!window) 
        window = [[UIApplication sharedApplication].windows objectAtIndex:0];
    [[[window subviews] objectAtIndex:0] addSubview:myView];    
    • Eso es increíble – gracias por señalar la garantía de calidad enlace. En documento oficial, es indocumentados (he rastreado a la Vista de la Ventana y de las guías de programación, y la UIWindow y UIView clases, no podía encontrar ninguna mención de él), y claramente un enorme error (que Apple no tiene intención de fijación, a juzgar por el tono de aseguramiento de la calidad artículo).
    • Agregar a la primera vista no funciona si desea mostrar delante de un modal vista controlador (al menos desde iOS5 en adelante) como referente de la vista de los controladores se agregan como un segundo punto de vista de la jerarquía en la principal UIWindow subvistas.
    • +1, por la muy buena y fácil de contestar. Muchas gracias :))
    • Gracias por destacar el inconveniente en este, voy a mantener este también en mi mente. 🙂
    • pero si nuestra aplicación tiene UINavigationController, mostrando su NavigationBar en la parte superior de mivista. ¿Por qué esto?
    • Hey @FábioOliveira, ¿has descubierto alguna solución en la situación en la que te dijo?
    • de acuerdo. voy a añadir una subvista en una subvista agregado a la vista. Se agrega como un hermano de la primera vista, no como un niño.
    • El vínculo que se menciona aquí es «¿por Qué no mi UIViewController girar con el dispositivo?». Lo que la pregunta es «¿por Qué no mi UIView girar con el dispositivo?» Estoy triste de que se trata de UIView propiedad de UIViewController. Y alienta sobre una rootViewController. Mi aplicación tiene un contenedor vew controlador como rootViewController. Pero el problema es UIView añadido a UIWindow no está funcionando. Su independiente Subvista extendido de UIView. Que es totalmente independiente del caso.
    • usted puede obtener count = 0 cuando la [ventana de subvistas]
    • Todavía no está trabajando en IOS7…de trabajo para IOS8
    • ventana = [[UIApplication sharedApplication].windows objectAtIndex:0]; en iOS7, en el paisaje que aún en vertical (el marco es de 768×1024 en el iPad). Y los límites también son 768×1024 y la transformación de la identidad de la transformación.

  2. 83

    El problema

    Principio con iOS 6, sólo la parte más alta de vista controlador (junto a la
    UIApplication objeto) participa en la decisión de si para girar en
    respuesta a un cambio de la orientación del dispositivo.

    https://developer.apple.com/library/content/qa/qa1688/_index.html

    La solución

    He de origen abierto una vaina llamada AGWindowView.

    Automáticamente lidiar con cualquier rotación y framechanges de modo que usted no tiene que preocuparse por eso.

    El código

    Soporta cualquier combinación de SDK de iOS y versiones de sistema. El código se puede encontrar aquí:
    https://github.com/hfossli/AGWindowView/blob/master/Source/AGWindowView.m

    • muchas gracias por su fría respuesta.
    • Esto es realmente una gran lib! Thx!
    • Muy útil código para un proyecto en el que estoy trabajando, que necesita a presentar puntos de vista en la parte superior de lo que se está mostrando actualmente. Brillante. Gracias!
    • Eres un salvavidas. Desearía haber encontrado este hace unas horas!
    • El punto de vista parece cambiar de tamaño para llenar la ventana en la rotación. ¿Cómo mantener el tamaño original?
    • Ese es el punto. 🙂 Si quieres una vista específica para mantener el tamaño original, entonces le sugiero que lo agregue como una subvista.
    • Para su INFORMACIÓN, hay un montón de cosas en el código anterior que hace referencia a métodos que no se encuentran en el estándar de ios bibliotecas. Supongo que cosas como UIInterfaceOrientationAngleOfOrientation se encuentran en el código completo que hfossli escribió.
    • Ok. Usted es libre de modificar o actualizar. La función que mencionar es que ya en este post.
    • Definitivamente esta la respuesta correcta. Se merece mucho más votos.
    • Gracias hfossli & ThomasW. keep it up. +1
    • Gracias 🙂
    • He actualizado el post. AGWindowView es compatible con iOS 8.

  3. 4

    He creado una categoría en la UIApplication que cuenta con un ayudante de la propiedad y el método para conseguir el primer subvista de la keyWindow. Esta es la vista que desea superposición de todos modos. Ahora, cuando se agrega un punto de vista de que es administrado por un UIViewController ese punto de vista, la shouldRotateToInterfaceOrientation: se llama al método.

    UIApplication+WindowOverlay.h

    #import <UIKit/UIKit.h>
    
    @interface UIApplication(WindowOverlay)
    
        @property (nonatomic, readonly) UIView *baseWindowView;
    
        -(void)addWindowOverlay:(UIView *)view;
    
    @end

    UIApplication+WindowOverlay.m

    #import "UIApplication+WindowOverlay.h"
    
    @implementation UIApplication(WindowOverlay)
    
        -(UIView *)baseWindowView{
            if (self.keyWindow.subviews.count > 0){
                return [self.keyWindow.subviews objectAtIndex:0];
            }
            return nil;
        }
    
        -(void)addWindowOverlay:(UIView *)view{
            [self.baseWindowView addSubview:view];
        }
    @end

    y aquí es cómo se debería utilizar.

    //at the top of the file...or in {yourproject}.pch
    #import "UIApplication+WindowOverlay.h
    
    //in a method:
    
    UIView *view = [UIView new];
    
    UIView *window = [UIApplication sharedApplication].baseWindowView;
    
    view.frame = window.bounds;
    
    [window addSubview:view];
    
    //or
    
    [[UIApplication sharedApplication] addWindowOverlay:view];
    • ¿Qué pasa con él conseguir el cambio de la orientación de los eventos?
    • su vista se gira y la autoresize máscara será honrado si el uso de este. se basa en lo que debería haber sido aceptado la respuesta de arriba. No tengo una respuesta para conseguir la rotación de eventos específicamente, pero estoy seguro de que ha sido contestada en algún otro lugar.
    • Ok. Me perdí la parte en la que fue una subvista de la ventana del primer subvista. Luego de un problema con este enfoque es que no se puede presentar desde un modal de controlador de vista. Tal vez si se agrega como una subvista de la última ventana del subvistas. De esta manera si usted tiene un modal de controlador de vista que muestra que usted tiene dos subvistas en la ventana principal: la raíz de controlador de vista de la vista y el oscurecimiento de la vista de los modales de controlador de vista y desea agregar a la atenuación de la vista, por lo que se muestra en la parte superior.
    • esto no funciona en iOS 7 si tienes un UIAlertView como que va a ser la clave de la ventana. [[UIApplication sharedApplication] windows][0] para volver a la ventana de la Aplicación.
  4. 1

    Esto es debido a que como usted menciona su punto de vista ha sido añadido directamente a la UIWindow, por lo tanto, cuando el método de girar se llama para la navegación controlador no pasa nada con el uiview. El UIView giraría si fue una subvista de la vista del controlador de vista. Si por alguna razón esto no se puede hacer. Entonces usted podría invalidar este método:

    //This method is called every time the device changes orientation
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    //Return YES for supported orientations
    }

    Y cada vez que sus cambios de orientación también cambiar su orientación de vista.

  5. 0

    Otra solución ¿cómo he resuelto este problema.

    Definir la Orientación actual:

    @interface AJImageCollectionViewController (){
        UIInterfaceOrientation _currentOrientation;
    }
    @end

    A continuación, compruebe la orientación en el viewWillLayoutSubviews:

    - (void)viewWillLayoutSubviews {
        [self checkIfOrientationChanged];
    }
    
    - (void)checkIfOrientationChanged {
        UIInterfaceOrientation newOrientation = [[UIApplication sharedApplication] statusBarOrientation];
        BOOL newOrientationIsPortrait = UIInterfaceOrientationIsPortrait(newOrientation);
        BOOL oldOrientationIsPortrait = UIInterfaceOrientationIsPortrait(_currentOrientation);
    
        //Check if the orientation is the same as the current
        if(newOrientationIsPortrait != oldOrientationIsPortrait){
            _currentOrientation = newOrientation;
            //Do some stuff with the new orientation
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here