ios - for - Interface Builder degrada los guiones gráficos, redimensiona y reposiciona las vistas en pequeños incrementos
xcode interface builder (3)
Tenemos varias aplicaciones de iOS a las que contribuyen diferentes desarrolladores. Un problema que sigo notando es que las vistas en nuestros guiones gráficos se desplazarán fuera de la posición en la que se colocaron o cambiarán de tamaño para que sean más pequeñas, lo que en las etiquetas que se ajustaron al texto originalmente se vuelve dolorosamente obvio cuando las etiquetas de repente están truncando su texto.
Me doy cuenta de que estas degradaciones de nuestras vistas aparecen en las confirmaciones de nuestro repositorio Git cuando el desarrollador no realizó ninguna edición directa en el guión gráfico. Es posible que hayan visto el guión gráfico en Interface Builder, pero no realizaron ningún cambio real en el guión gráfico. Sin embargo, los cambios se guardaron y se comprometieron junto con lo que estaban trabajando.
Cuando hago una comparación de texto entre los archivos del guión gráfico antes y después de las confirmaciones responsables, veo pequeños cambios para ver marcos como:
<rect key="frame" x="203" y="8" width="362" height="29"/>
|
V
<rect key="frame" x="203" y="7.5" width="362" height="29"/>
y
<rect key="frame" x="446.00000170260091" y="7" width="302" height="30"/>
|
V
<rect key="frame" x="446" y="7" width="302" height="30"/>
y
<rect key="frame" x="364" y="3" width="200" height="38"/>
|
V
<rect key="frame" x="363" y="3" width="200" height="38"/>
y
<rect key="frame" x="284" y="7" width="97" height="30"/>
| |
V V
<rect key="frame" x="283" y="7" width="96" height="30"/>
y
<rect key="frame" x="384.00001078580522" y="7" width="101" height="30"/>
| |
V V
<rect key="frame" x="383.00000530853856" y="7" width="100" height="30"/>
La mayoría de las veces, los números para las dimensiones del cuadro cambian solo una pequeña cantidad, un valor entero cambia en uno o un valor de coma flotante se trunca o la porción decimal se cambia levemente.
Otras veces, los valores están cambiando en algunos puntos, como:
<rect key="frame" x="334" y="3" width="200" height="38"/>
|
V
<rect key="frame" x="331" y="3" width="200" height="38"/>
y
<rect key="frame" x="251" y="7" width="223" height="30"/>
|
V
<rect key="frame" x="251" y="7" width="220" height="30"/>
y
<rect key="frame" x="478" y="3" width="274" height="38"/>
| |
V V
<rect key="frame" x="475" y="3" width="276" height="38"/>
Tenga en cuenta que todos estos cambios de marco de ejemplo se tomaron del mismo ejemplo de confirmación cuando el desarrollador no tenía la intención de hacer un solo cambio en el guión gráfico. Hubo 269 diferencias en el XML entre las dos versiones del archivo, todas ellas son estos ligeros cambios en los tamaños o las posiciones de los cuadros. El XML del guión gráfico es ~ 9000 líneas.
Parece que el problema puede tener algo que ver con el uso de números de coma flotante y errores de redondeo por parte de IB, y las diferencias que desaparecen en unos pocos píxeles podrían ser una agregación de estos errores de redondeo durante un período de varias veces abrir, analizar y volver a serializar los datos.
Sin embargo, esto es solo una teoría, ya que no he podido determinar la causa exacta de los cambios no deseados. A menudo, las confirmaciones no realizan ningún cambio significativo en los marcos, solo cambios insignificantes de coma flotante como 446.00000055262581 -> 446.00000112002783. Pero cuando ocurren los cambios serios, parecen ocurrir en grandes cantidades.
Las confirmaciones entre las que se producen los cambios también las realiza el mismo desarrollador utilizando la misma versión de Xcode e Interface Builder.
En este ejemplo, confirme dónde se tomaron estos datos, la etiqueta del documento es
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6250" systemVersion="14A389" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="JAD-vj-VfC">
en ambas versiones del archivo del guión gráfico, por ejemplo.
Además de estar seguro de verificar que no se realicen cambios insignificantes o involuntarios en los archivos del guión gráfico, me gustaría limitar qué está causando estos cambios no deseados en nuestras vistas del guión gráfico. Si es algo que podemos evitar hacer que está causando el problema, podemos ser conscientes de la causa.
Actualización: como Tim señaló útilmente, este problema parece ser causado al usar Interface Builder en una pantalla de retina. Todos los desarrolladores que han causado el problema tienen retina MacBook Pros. Aquellos de nosotros sin pantallas de retina no hemos experimentado el problema.
Esto parece ser un error relacionado con la serialización de los valores CGFloat de Interface Builder. Los valores de tamaño y posición para los marcos de vista son puntos flotantes. Pero sus valores son siempre enteros. La manipulación gráfica interna requiere que sean punto flotante para que funcionen las matemáticas de transformación, pero todo siempre se expresa en términos de valores de puntos enteros redondos.
Cuando estos valores de coma flotante se serializan en el XML del guión gráfico, IB a menudo serializa los valores como enteros, pero en ocasiones también los serializa como números de coma flotante. No estoy seguro de por qué toma la decisión de hacerlo de esta manera cuando lo hace, pero es menos común. En mis cuadros de ejemplo anteriores, 3 de los valores terminaron siendo coma flotante, mientras que los otros son enteros.
También visto en mis ejemplos, a menudo la representación de coma flotante se cambiará para ser serializada como un entero. Aquí es donde creo que se encuentra el error.
Una cosa que noté con la forma en que los marcos de vista estaban cambiando, tendían a moverse hacia la izquierda o reducir su tamaño. Entonces, los valores son cada vez más pequeños. Puede ver en los ejemplos que proporcioné, este es siempre el caso.
Los puntos flotantes no tienen la precisión para expresar valores enteros exactamente, pero son precisos con varios decimales. Entonces, aunque a veces los enteros se expresan como los de mis ejemplos como ligeramente más altos que el valor entero (es decir, 384.00001078580522), otros se expresan como ligeramente más bajos que el valor entero. Aquí hay un ejemplo de un cambio de marco que hizo IB:
<rect key="frame" x="457" y="7" width="291" height="30"/>
|
V
<rect key="frame" x="456.99999985252464" y="7" width="291" height="30"/>
Si bien este cambio en particular no parecía modificar el valor del marco directamente. Ambos números son esencialmente iguales a 457. Lo que creo que está ocurriendo es cuando este XML se vuelve a analizar cuando se abre nuevamente el guión gráfico, podría estar truncando el valor 456.99999985252464 y leerlo como 456. Esto provoca que los valores se vuelvan progresivamente más pequeño, reduciendo los tamaños o desplazando la posición de los cuadros hacia la izquierda o hacia arriba.
Por supuesto, esto es solo una teoría y no da una razón por la cual Interface Builder está haciendo esto. Parece haber comenzado desde el reciente lanzamiento de Xcode 6. Además, no explica cómo pasó de 8 a 7.5 en un ejemplo o incluso la vez que pasó de 274 a 276 en mi último ejemplo. Pero en su mayor parte, la mayoría de los cambios tienden a ir hacia abajo.
Estoy presentando un error con Apple para que lo revisen.
La pista más interesante de este misterio es que parece especialmente malo cuando abres el mismo guión gráfico en una pantalla Retina en lugar de una pantalla sin retina.
Al principio, iba y venía entre un iMac 4k y un Macbook pro pre-retina y recibía un gran volumen de cambios (~ 300 líneas alteradas cada vez).
Luego simplemente arrastré la ventana xcode de mi monitor principal (4k / retina) a mi segundo monitor (2560x1440, sin retina), y aunque la ventana tenía el mismo tamaño, xcode redimensionó todos los elementos y se quejó de ~ 50 vistas extraviadas . Lo moví de nuevo a la pantalla de retina y aproximadamente la mitad de los errores "extraviados" desaparecieron, pero la mitad permaneció. El reescalado, como sugiere, degrada los datos subyacentes.
Si tienes varios desarrolladores trabajando en el mismo archivo, es probable que esto suceda con frecuencia.
¿La solución? Es probable que todo esto se corrija en Apple: no he encontrado ninguna configuración que lo mitigara de lo contrario.
Podría tener una respuesta a este problema. Es una característica menos conocida de abrir las aplicaciones en modo de baja resolución. Recientemente tuvimos un problema similar en el que la vista de contenido de las celdas de la vista de tabla tenía un 0,5 extra para la altura cuando la línea de separación se establece en predeterminada o individual. Cuando se establece en Ninguno, entonces este problema no estaba allí. Pasos 1. Arrastre un TVC predeterminado al guión gráfico. Verifique el alto de la vista de contenido de la celda de vista de tabla. Será 43.5. 2. Establezca la línea de separación para la vista de tabla en Ninguna. La vista de contenido de la celda cambia a 44.
Ahora salga de Xcode y configure Abrir en modo de baja resolución en la ventana Finder Get Info para la aplicación Xcode. Ahora, si sigue los mismos pasos anteriores, mostrará la altura de la vista de contenido para la celda de vista de tabla como 43.
Cuando hay diferentes miembros del equipo trabajando en pantallas retina y no retina, simplemente obtendría los archivos del guión gráfico modificados solo porque abrió el guión gráfico en la pantalla retina. Una solución alternativa para esto es activar el modo Abrir en baja resolución y trabajar. Pero luego vence el propósito de tener una pantalla de retina, pero es mejor que tener guiones gráficos marcados como modificados, aunque no haya cambiado nada.