IOS7: desplazamiento UIScrollView en UINavigationController

126

Actualmente estoy migrando mi aplicación en ios 7 y he estado atascado durante horas en el nuevo control de navegación / gestión de barras.

Antes, cuando teníamos un controlador de navegación, teníamos un fragmento como este:

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

En el generador de interfaces, teníamos la opción de establecer una barra de navegación existente para la vista y todo coincidía con el contenido de la vista real.

Bien, ahora no tengo idea de cómo diseñar correctamente con el generador de interfaces. Todavía tengo mi fragmento para inicializar mi navcontroller. Sin embargo, en el generador de interfaces para mi MainViewController, si configuro una barra de estado en una barra de navegación translúcida u opaca, tengo un desplazamiento de 44 px en la parte superior (ver más abajo).


Interface Builder_________________________Y el resultado


Ahora, si configuro la barra de estado en ninguno, no hay desplazamiento en la parte superior, pero dado que la vista en el simulador es más pequeña debido a la barra de navegación, la parte inferior de la vista en el generador de interfaces está cortada.

Interface Builder_________________________Y el resultado

Supongo que realmente me falta algo aquí, pero no puedo encontrar ningún tema o información de Apple en la Guía de transiciones de iOS7 sobre eso.

Gracias por tu ayuda


EDITAR

Como podemos ver en las imágenes, el primer elemento secundario de la vista es un UIScrollView que contiene ambas etiquetas, el problema no aparece cuando no hay una vista de desplazamiento. También aparece si es un UITableView. Si una etiqueta está fuera de UIScrollView, no hay desplazamiento en esa etiqueta.

streem
fuente
Es posible que desee usar Autolayout si no lo está, para asegurarse de que ciertas vistas estén a una distancia establecida de la parte superior / inferior / lateral de la pantalla
erdekhayser
De hecho, no estoy usando Autolayout, pero usarlo (marcando la casilla de verificación) no resuelve el problema.
streem
Con Autolayout, debe establecer restricciones para que las vistas permanezcan en su lugar. Xcode no sabe lo que quieres automáticamente.
erdekhayser
Al ver tu edición anterior, acabo de descubrir tu problema. Desafortunadamente, no es la solución más obvia. En lugar de tratar de explicarlo de nuevo, utilicé este video en Youtube para aprender cómo configurar vistas de desplazamiento. youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be Buena suerte. Me tomó un par de veces verlo para comprender completamente lo que está haciendo.
erdekhayser

Respuestas:

286

OK, así que encontré la solución, configuré en mi controlador la propiedad:

self.automaticallyAdjustsScrollViewInsets = false

Sin embargo, realmente no entiendo el verdadero beneficio de esta propiedad (o por qué el valor predeterminado es verdadero)

La única documentación que encontré estaba allí:

Actualizar

En iOS 11 automaticallyAdjustsScrollViewInsetsestá en desuso

Ahora deberías usar:

self.tableView.contentInsetAdjustmentBehavior = .never

También le animo a que consulte esta pregunta y su respuesta para comprender mejor esas propiedades.

streem
fuente
12
Gran hallazgo. UIScrollView en storyboard es realmente complicado. Ojalá Apple lo haga un poco perfecto en futuras versiones de Xcode.
p0lAris
44
Este código evita que mi se UIScrollViewdesplace. Pero sin esto no puedo deshacerme del desplazamiento. Weired ...
scaryguy
9
Esta bandera también se puede desactivar en su guión gráfico / plumín, el Controlador de vista tiene una casilla de verificación "Ajustar inserciones de vista de desplazamiento". He estado golpeándome la cabeza contra la pared durante tanto tiempo ahora tratando de resolver mis problemas con las vistas de desplazamiento y el diseño automático, lo que es aún más complicado al admitir iOS 6 y 7. ¡Muchas gracias por finalmente proporcionar una solución!
Newtz
2
El documento de la aplicación le indicaría que establecer navigationbar.translucent = YES evitaría que la barra de navegación empuje el contenido hacia abajo. Es la mentira más grande y me costó muchas horas de trabajo hasta esta publicación. Además, debe establecer self.automaticallyAdjustsScrollViewInsets = NO; Muchas gracias por este post !!!!!!! Manzana y manzana?
user779764
Descubrí que esto causaba que los límites de mi UIScrollView se desplazaran hacia abajo por la altura de la barra de navegación (-64 puntos). Sobreescribí esto manualmente a 0, pero descubrí que el UISrollView todavía se desplazaría en el eje y, y "encajaría" en una línea imaginaria en -64. Su solución resolvió esto.
gdbj
92

La respuesta de @Justafinger también funcionó de maravilla para mí.

Solo quería agregar que esta configuración también se puede ajustar fácilmente desde el generador de interfaces.

  1. Seleccione su controlador de vista
  2. Haga clic en la pestaña 'Inspector de atributos'
  3. Desmarque 'Ajustar inserciones de vista de desplazamiento'
  4. ¡Disfrutar!

ingrese la descripción de la imagen aquí

Myxtic
fuente
¡Pasé años buscando esta opción en las propiedades UIScrollView y no en el controlador de vista! ¡Gracias!
Dominic Williams
11

Me encontraba con este mismo problema, pero encontré una propiedad bastante extraña en el ViewController en el generador de interfaces que parece haberme causado esto. Hay un conjunto de casillas de verificación "Extender bordes". Eliminé la verificación "Debajo de las barras superiores", y todo comenzó a diseñarse correctamente para mí.

Ben Nicholas
fuente
Sí, este funcionó para mí mejor que "Ajustar los recuadros de vista de desplazamiento"
Dmytro
2

Con automaticAdjustsScrollViewInsets establecido en YES (la configuración predeterminada), existe una discrepancia en el posicionamiento de la vista de desplazamiento entre ios6 y ios7, por lo que para que sean coherentes debe deshabilitar esta configuración. Sin embargo, ios6 se bloqueará si aparece automáticamente AjustaScrollViewInsets, por lo que debe realizar un cambio programático de condicionalAdjustsScrollViewInsets condicional en ios7 o desactivar la opción usando el guión gráfico / NIB

dawid
fuente
2

Tuve un problema similar, después de descartar un viewController, el contentOffset de mi tableView se cambió a (0, -64).

mi solución fue un poco extraña, probé todas las otras respuestas pero no tuve éxito, lo único que solucionó mi problema fue cambiar la posición tableView en el árbol de controles del .xib

fue el primer control en la Vista principal así:

antes de

Moví el tableView justo después del ImageView y funcionó:

después

parece que poner la vista de la tabla en la primera posición estaba causando el problema, y ​​mover la vista de la tabla a otra posición solucionó el problema.

PD No estoy usando autoLayout ni storyboards

¡Espero que esto pueda ayudar a alguién!

Chuy47
fuente
Noté este comportamiento extraño, creo que la lógica detrás es que scrollViewInsets se ajustan automáticamente cuando una vista de desplazamiento es el primer elemento secundario. De lo contrario, no tiene sentido porque su vista de desplazamiento es probablemente no a pantalla completa.
streem
1

También me enfrento a este problema.

UIScrollView El tamaño del contenido es calculado por el sistema operativo como otros tamaños, orígenes proporcionados por el sistema de restricción; es por eso que el sistema operativo tiene dudas.

Cómo solucionarlo: debe definir explícitamente el tamaño del contenido de UIScrollView:

  1. Incrustar contenido desplazable en UIView(le cambio el nombre ContentView)
  2. Agregar restricciones:

ContentView.Weight = View.Weight y ContentView.Height = View.Height

ingrese la descripción de la imagen aquí

maslovsa
fuente
0

Parece que una solución alternativa es ver el archivo del guión gráfico como "iOS 6.1 y versiones anteriores" (seleccione el archivo del guión gráfico-> Inspector de archivos-> Documento del Generador de interfaz-> Ver como. Colocar subvistas en este modo muestra el desplazamiento.

swhitman
fuente
Bueno, no estoy usando storyboard. Sin embargo, no estoy seguro de que sea un problema de ios6 a ios7, el ejemplo anterior se ha creado completamente con iOS 7. Además, edité mi pregunta, solo aparece (hasta donde yo sé) con uiscrollview y uitableview.
streem
Hmm interesante ... Al investigar esto, puede agregar variant = "6xAndEarlier" a la parte superior de la XIB en el elemento del documento, ya que esta es la diferencia al voltear el bit que mencioné anteriormente. Y para su información, este problema también me sucede a uiwebview.
swhitman
0

¡Gracias a todos por las soluciones! Luché durante horas tratando de resolver el problema. Todo estaba bien cuando no había ninguna barra de navegación involucrada, pero se volvió loco en el momento en que incruste el ViewController en un NavigationController.

Lo resolví desmarcando los recuadros Ajustar vista de desplazamiento y las barras inferiores superiores . Ambos se encuentran en el Inspector de atributos de ViewController. ¡Un millón de gracias!

Jackson Gan
fuente