iphone ios objective-c xcode ios7

iphone - iOS7-Ver en la barra de estado-edgesForExtendedLayout no funciona



objective-c xcode (7)

Tengo un proyecto que se construyó el año pasado y usa XIB, no guiones gráficos. Los XIB no utilizan Auto Layout, pero sí utilizan algunos Autosizing. Tengo un problema cuando ejecuto iOS7, en el que todas las vistas están ocultas debajo de la barra de estado. Entiendo perfectamente que esta es una nueva característica de iOS7, en la que se puede esperar. Sin embargo, todas las soluciones para solucionarlo para no hacer esto no funcionan. Tengo una imagen en la parte superior de la vista que siempre se muestra debajo de la barra de estado, y no estoy usando las barras de navegación ni nada de eso.

He intentado actualizar los Y-deltas en el XIB (no tienen ningún efecto en la vista), he intentado configurar el edgesForExtendedLayout en UIRectEdgeNone (no hace nada), y una multitud de otras cosas. Cada vez, la barra de estado se muestra con la vista escondida debajo de ella, sin importar lo que haga ... es decir, a menos que baje manualmente la vista en el XIB para dejar espacio para la barra de estado (pero esa solución no funciona porque no se ve bien en iOS6, por supuesto).

Lo que es extraño es que incluso cuando intento una línea de código para hackear un cambio de vista, no funciona (como lo siguiente):

self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y+20, self.view.frame.size.width, self.view.frame.size.height);

..No es que vaya con ese tipo de solución, pero es extraño que no haya funcionado (la única vez que veo que no funciona es si Auto Layout está en su lugar, lo cual no es así en este caso).

Es un requisito de diseño que se muestra en la barra de estado, y me he quedado perplejo porque no puedo configurar la vista para que esté bajo la barra de estado para iOS7. He leído cada publicación de Stack Overflow sobre el tema, así como las guías / transición de Apple. Una vez más, para reiterar, comprendo perfectamente cómo debería funcionar y cuál debería ser la solución esperada para esto, pero nada de eso parece funcionar para este proyecto en particular.

Soy un desarrollador de iOS con experiencia, pero este proyecto fue creado por otro equipo, así que no sé si hay algo oculto en algún lugar de los archivos XIB, plist o código que pueda estar superando las configuraciones anteriores. Por favor, avíseme si hay algo más que se pueda ver en esto, o más información que pueda proporcionar.

¡Gracias por adelantado!


¿Ha intentado ver sus XIB como fuente y eliminar cualquier línea que contenga bordes para la reproducción extendida?

Tuvimos que eliminar esta línea en las escenas de nuestro guión gráfico ya que las vistas principales de las escenas de nuestro guión gráfico están representadas por XIB

Lo que nos estaba sucediendo era que, de alguna manera, en algunas escenas, el contenido XIB para la vista principal de la escena estaba siendo empujado hacia abajo por la altura de la barra de estado y la barra de navegación.

La eliminación de esa línea permitió que los XIB se mostraran como si su parte superior se originara en la misma parte superior de la escena de su guión gráfico.

Lamentablemente, no tenemos idea de qué lo provocó, pero lo vi cuando se cambiaba el orden de los contenidos dentro de la vista principal del XIB para que apareciera primero un UITextView. Reorganizar el orden de los elementos después de que se activó esto no tuvo ningún efecto en eliminar este comportamiento no deseado.

Espero que esto ayude a alguien más a encontrarse con este tipo de problema.


1) La solución más simple si no te importa tener una barra de navegación opaca:

self.navigationController.navigationBar.translucent = NO;

2) La respuesta de svguerin3 no puede funcionar en el caso general. Por ejemplo, si una de sus subvistas utiliza el autoajuste para engancharse en la parte inferior de su contenedor, entonces su nueva posición será incorrecta. Y podría salir de la pantalla en el peor de los casos.


Apple te está presionando para que uses el autolayout para lograr esto. Debe establecer una restricción en la "Guía de diseño superior" desde la subvista superior de su vista.

Vea este documento para ejemplos:

https://developer.apple.com/library/ios/qa/qa1797/_index.html

Para hacer esto sin XIBs, deberá agregar la restricción programáticamente. Los documentos de Apple dan un buen ejemplo de esto, que he resumido a continuación.

topLayoutGuide que topLayoutGuide es una propiedad en un controlador de vista, simplemente lo utiliza en su diccionario de enlaces de variables. A continuación, configura su restricción como normal:

id topGuide = [myViewController topLayoutGuide]; NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(button, topGuide); NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide]-20-[button]" options:0 metrics:nil views:viewsDictionary];

La documentación para esto se puede encontrar https://developer.apple.com/library/ios/qa/qa1797/_index.html .


Para referencia, la solución a continuación funcionó cuando la apliqué a mis ViewControllers. Sin embargo, no es ideal y un poco hacky. Si es el único enfoque que puedo tomar, entonces que así sea.

float systemVersion=[[[UIDevice currentDevice] systemVersion] floatValue]; if(systemVersion>=7.0f) { CGRect tempRect; for(UIView *sub in [[self view] subviews]) { tempRect = [sub frame]; tempRect.origin.y += 20.0f; //Height of status bar [sub setFrame:tempRect]; } }


Si configura los valores delta de iOS 6/7 en Interface Builder, recuerde configurar "Ver como" en "iOS 6" en el documento Interface Builder, ya que es el diseño de iOS 6 el que desea replicar. Los deltas se usarán solo en iOS 7 para empujar el contenido debajo de la barra de estado. Si deja "Ver como" configurado en iOS 7 (el valor predeterminado), los deltas le darán el aspecto de iOS 7 en iOS 6.

Sin embargo, los deltas no le ayudarán si cambia la posición o el tamaño de las vistas mediante programación en función del marco de la vista, ya que el marco no tiene en cuenta los deltas.

En lugar de usar los deltas, la mejor solución que he encontrado es habilitar el diseño automático en su XIB principal y luego establecer la restricción de espacio superior en su vista superior / contenido para seguir la Guía de diseño superior. Esta guía se introdujo en iOS 7 y representa la posición debajo de la barra de estado. Desafortunadamente, la guía no está disponible en Interface Builder cuando no se utiliza Storyboards, pero puede agregarla mediante programación.

Lo que hice fue agregar una restricción de espacio superior a la supervisión en su lugar en Interface Builder, y creó una salida para esto en el código. Luego, en viewDidLoad, si está disponible topLayoutGuide (iOS 7+), reemplace la restricción en este punto de venta con una versión que use la Guía de diseño superior.

if ([self respondsToSelector:@selector(topLayoutGuide)]) { [self.view removeConstraint:self.containerTopSpaceConstraint]; self.containerTopSpaceConstraint = [NSLayoutConstraint constraintWithItem:self.contentView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom multiplier:1 constant:0]; [self.view addConstraint:self.containerTopSpaceConstraint]; [self.view setNeedsUpdateConstraints]; [self.view layoutIfNeeded]; }


Si está utilizando el guión gráfico, después de configurar el diseño superior de su vista, puede desmarcar "Debajo de las barras opacas" en el Inspector de atributos


- (void)viewDidAppear:(BOOL)animated { [self.view setFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height)]; // OR self.view.transform = CGAffineTransformMakeTranslation(0, 20); }