El problema que estoy enfrentando es este:

Quiero implementar una app de iOS 7, con un bonito diseño y de izquierda/derecha del menú, que aparece después de la vista principal de animar a sí mismo a la derecha/izquierda. Estoy haciendo esto con [UIView animateWithDuration...] código, pero eso no es realmente importante. Lo que quiero lograr es el mismo efecto que el Buzón de correo de iOS 7 aplicación: para mover la barra de estado lejos (a la derecha/a la izquierda) con la vista principal

Imagen para una mejor explicación:

Moviendo la barra de estado de iOS 7

Lo que sólo he encontrado es este artículo sobre el tema, con algunas código de trabajo el uso Privado de la Api, que me gustaría no usar, ya que quiero que mi aplicación para ser aceptada en la App Store.

Me gustaría conseguir el mismo efecto («legalmente»). ¿Alguien sabe cómo?

Gracias!

  • Buzón no parecen estar usando el estándar de la Barra de Estado. Se está pegando un texto hasta allí, así que supongo que estás usando algo como github.com/myell0w/MTStatusBarOverlay, pero actualizado para iOS 7.
  • Crear un contenedor controlador y agregar a su menú principal y ver como childViewControllers. A continuación, puede configurar la barra de estado ocultos en el menú del controlador, y se preservará el otro punto de vista del controlador de la barra de estado, sin el uso de capturas de pantalla (que son menos que impresionante en mi opinión).
  • ha tenido usted un ejemplo de un proyecto? Si sí, puedes compartir esta?
InformationsquelleAutor Gyfis | 2013-09-25

5 Comentarios

  1. 48

    El quid de la cuestión es el uso de este método introducido en iOS 7:

    https://developer.apple.com/documentation/uikit/uiscreen/1617814-snapshotview:

    Con esto se obtiene una UIView que contiene una captura de pantalla que incluye la barra de estado. Una vez que tienes eso, es sólo una cuestión de ocultar de su vista actual y, a continuación, empujando la captura de pantalla de la vista alrededor.

    He publicado una prueba de concepto aquí:
    https://github.com/simonholroyd/StatusBarTest

    NOTA no he enviado el código que hace esto a través de la Apple proceso de revisión, pero esto no es una API privada método.

    • Esto se ve interesante, lo voy a mirar en él y el informe de mis resultados!
    • Otra cosa a tomar nota de si seguir adelante con esta característica: el Buzón de la aplicación tiene un error en cuando multitarea, la captura de pantalla muestra no suprime la barra de estado. Así que si usted salir de la aplicación con el menú de la izquierda abierta, luego de realizar múltiples tareas, verá duplicado las barras de estado en la vista de multitarea.
    • Que en realidad es bastante bueno saber! Ellos no son dioses 🙂 Gracias!
    • Hola, estoy tratando de escribir el código, pero ahora me di cuenta que este método sólo se necesita un imagen de la pantalla! Me estaba preguntando en lugar de un funcional de la barra de estado se trasladó de una captura de pantalla, aunque es un buen método
    • A pesar de que, como parece, el Buzón de la aplicación lo hace de la misma manera, desde la barra de estado no cambia cuando se mueve fuera de la pantalla. La única cosa que estoy pensando ahora es ‘Busted!’
    • Se preguntó cómo lograr el mismo efecto!!!! Es sólo eso, un efecto.
    • Sí, por supuesto que tienes razón 🙂 ya he logrado la tarea (el efecto), así que probablemente voy a publicar algo al respecto de esta noche aquí
    • +1 Que es Super cool @SimonHolroyd! Me encanta la forma en que usted está utilizando la captura de pantalla a continuación, utilizar la vista a la vez que oculta el estado actual de la barra 😉 jeje muy ingenioso! El hombre que deseo ver otros proyectos interesantes como este, si sólo hay un lugar donde usted puede ver rápidamente todos estos tipo de ingeniosos trucos para desarrollo en iOS! Si alguien sabe de algo bueno, como esta relacionado para nada, por favor, etiqueta de mí y que me haga saber! saludos!
    • Esta no es la manera de buzón hace. Aunque no estoy seguro de cómo lo hacen, usted puede ver que su estado de notificaciones de la barra de terminar la animación, incluso mientras que en el ‘slide-abrir la posición. (Pulse el botón deslizante inmediatamente después de la primera vez que abra la aplicación y verás esto)

  2. 7

    Así, después del impulso inicial, por Simon Holroyd y algunas de búsqueda, he encontrado la solución de cómo lograr este efecto de «funcionalidad». Este es el código:

    statusbarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];

    EDIT: señor pcholberg señalado correctamente que el código anterior no funciona en el dispositivo real, sólo en el Simulador de iOS, así que lo he editado por su recomendación

    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    {
        UIView *screenShot = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO];
        [statusbarView addSubview:screenShot];
        [statusbarView setClipsToBounds:YES];
        [self.view addSubview:statusbarView];
    
        [self setPrefersStatusBarHidden:YES];
        [self prefersStatusBarHidden];
        [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    }

    - (BOOL)prefersStatusBarHidden
    {
        return prefersStatusBarHidden;
    }


    Así que la primera parte crea contexto, se utiliza el método de Simon mencionado, señala a la vista con la barra de estado, y guarda como un UIImage

    La segunda parte añade la instantánea UIView a mi viewController del UIView

    Y la tercera parte de los conjuntos de mis bool para la barra de estado para SÍ (es más fácil de usar en el método anterior), y llama a los métodos de redibujar su

    Este, a continuación, establece el UIView como no-funcional de la barra de estado en su lugar y se esconde la original, así que no hay doble representación. A continuación, puede utilizar esta vista en mi [UIView animateWithDuration... método

    Y cuando vuelva, yo uso este código en el controlador de finalización de la animación bloque:

    [statusbarView removeFromSuperview];
    
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    {
    
        [self setPrefersStatusBarHidden:NO];
        [self prefersStatusBarHidden];
        [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    
    }

    Y voilá! Esto funciona como el descrito efecto en mi pregunta.

    Espero que esto ayude a alguien!

    • No prestar snapshotView ([[UIScreen pantalla principal] snapshotViewAfterScreenUpdates:NO]) en la imagen, la foto aparecerá sin texto en la barra de estado en el dispositivo real. Sólo tiene que añadir esta shanpshot como subvista.
    • Tienes toda la razón! Esto de alguna manera funciona en el simulador, sin embargo no en un dispositivo real. Pero yo no era capaz de agregar la instantánea como subvista y moverlo después, ya que parecía que los cambios después de algún tiempo…
    • ¿Cuál es el propósito de [self prefersStatusBarHidden]; en el código, ya que no estamos haciendo nada con el valor de retorno? Y por qué se tiene que hacer [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; en lugar de sólo [self setNeedsStatusBarAppearanceUpdate]? Si el código no funciona sin esas líneas, me gustaría ser reacios a utilizar en una aplicación como sería probable que de repente deje de trabajar con una nueva versión de iOS.
    • He sustituir el método prefersStatusBarHidden, que ahora devuelve un valor de tipo boolean – prefersStatusBarHidden (ahora que lo veo, es bastante extraño que el nombre de la misma manera!). Sobre el selector – no estoy muy seguro, es, posiblemente, alguna referencia a una gran cantidad de ajustes y cambiando poco bits por lo que el efecto conjunto iba a funcionar.
  3. 7

    Yo uso este método para mover statuebar con regulador de vista,en una aplicación hay dos ventanas,una ventana normal,otros statuBarWindow,tengo statuBarView que superView es statuBarWindows ,y se mueven con regulador de vista.

    - (UIView *)statuBarView
    {
        NSString *key = [[NSString alloc] initWithData:[NSData dataWithBytes:(unsigned char []){0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x61, 0x72} length:9] encoding:NSASCIIStringEncoding];
        id object = [UIApplication sharedApplication];
        UIView *statusBar = nil;
        if ([object respondsToSelector:NSSelectorFromString(key)]) {
            statusBar = [object valueForKey:key];
        }
        return statusBar;
    }
    • Esto es bastante interesante.. este es considerado como un uso de las manzanas API privada? También, ¿por qué el uso dataWithBytes en lugar de sólo @»barra de estado», que es lo que se convierte en.. es que para evitar la detección de alguna manera? (parece como que iba a comprobar este sencillo trabajo de todo..)
    • Muy bien ofuscado 😉
  4. -3

    En mi experiencia, la App Store de los revisores generalmente no se preocupan por privado de la API de uso, especialmente en este sencillo e inofensivo.
    Para la tarea se puede obtener un puntero a la aplicación de la barra de estado de la vista a través de varios métodos, que se puede encontrar en iOS encabezado completo como https://github.com/nst/iOS-Runtime-Headers

    • Si tienes lejos con el uso de una API privada, es una anomalía. Hay un gran riesgo de romper las reglas, y yo no se lo aconsejo a la gente a probar.

Dejar respuesta

Please enter your comment!
Please enter your name here