Abbiamo un numero di app iOS a cui contribuiscono diversi sviluppatori. Un problema che continuo a notare è che le visualizzazioni nei nostri storyboard si spostano dalla posizione in cui sono state inserite o ridimensionate in modo che siano più piccole, che su etichette che sono state ridimensionate per adattarsi al testo originariamente diventa dolorosamente evidente quando le etichette sono tutte improvvisamente stanno troncando il loro testo.Interface Builder degrada storyboard, ridimensiona e riposiziona le visualizzazioni in piccoli incrementi
Sto notando che queste degradazioni delle nostre visualizzazioni appaiono in commit al nostro repository Git quando lo sviluppatore non ha apportato direttamente alcuna modifica allo storyboard. Potrebbero aver visualizzato lo storyboard in Interface Builder, ma non hanno apportato modifiche reali allo storyboard. I cambiamenti sono stati tuttavia salvati e commessi insieme a ciò su cui stavano lavorando.
Quando faccio un testo confronto tra le file di storyboard, prima e dopo i commit responsabili vedo piccoli cambiamenti di visualizzare fotogrammi come ad esempio:
<rect key="frame" x="203" y="8" width="362" height="29"/>
|
V
<rect key="frame" x="203" y="7.5" width="362" height="29"/>
e
<rect key="frame" x="446.00000170260091" y="7" width="302" height="30"/>
|
V
<rect key="frame" x="446" y="7" width="302" height="30"/>
e
<rect key="frame" x="364" y="3" width="200" height="38"/>
|
V
<rect key="frame" x="363" y="3" width="200" height="38"/>
e
<rect key="frame" x="284" y="7" width="97" height="30"/>
| |
V V
<rect key="frame" x="283" y="7" width="96" height="30"/>
e
<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"/>
maggior parte del tempo i numeri per dimensioni del telaio cambiano da solo una piccola quantità, sia un valore intero cambia di uno o di un valore di virgola mobile è troncato o la parte decimale è cambiato di poco.
Altre volte, i valori cambiano da pochi punti anche se, come:
<rect key="frame" x="334" y="3" width="200" height="38"/>
|
V
<rect key="frame" x="331" y="3" width="200" height="38"/>
e
<rect key="frame" x="251" y="7" width="223" height="30"/>
|
V
<rect key="frame" x="251" y="7" width="220" height="30"/>
e
<rect key="frame" x="478" y="3" width="274" height="38"/>
| |
V V
<rect key="frame" x="475" y="3" width="276" height="38"/>
noti che tutti questi cambiamenti esempio telaio erano preso dallo stesso esempio di commit quando lo sviluppatore non intendeva apportare una sola modifica allo storyboard. C'erano 269 differenze nell'XML tra le due versioni del file, tutte queste piccole variazioni nelle dimensioni o nelle posizioni dei fotogrammi. Lo storyboard XML è di ~ 9000 righe.
Sembra che il problema potrebbe avere qualcosa a che fare con l'uso di IB di numeri in virgola mobile e errori di arrotondamento e le differenze che si annullano di pochi pixel potrebbero essere un'aggregazione di questi errori di arrotondamento in un periodo di diverse volte di apertura, analisi e ri-serializzare i dati.
Questa è solo una teoria, anche se non sono stato in grado di individuare la causa esatta delle modifiche indesiderate. Spesso i commit non apportano modifiche significative ai frame, solo modifiche a virgola mobile insignificanti come 446.00000055262581 -> 446.00000112002783. Ma quando si verificano i gravi cambiamenti, sembrano verificarsi in gran numero.
I commit tra i quali si verificano le modifiche vengono effettuati anche dallo stesso sviluppatore utilizzando la stessa versione di Xcode e Interface Builder.In questo esempio, commit in cui sono stati presi questi dati, il tag del documento è <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">
in entrambe le versioni del file storyboard, ad esempio.
Oltre a controllare che non vengano apportate modifiche insignificanti o non intenzionali ai file dello storyboard, vorrei limitare ciò che causa queste modifiche indesiderate alle visualizzazioni dello storyboard. Se è qualcosa che possiamo evitare di fare è il problema, possiamo essere consapevoli della causa.
Aggiornamento: Come utilmente ha osservato Tim, questo problema sembra essere causato durante l'utilizzo di Interface Builder su un display retina. Tutti gli sviluppatori che hanno causato il problema hanno retina MacBook Pro. Quelli di noi senza display retina non hanno riscontrato il problema.
Grazie per la lunga spiegazione Jeff, questo capita anche a noi. Hai trovato un modo per evitarlo? – celiker
@celiker Come Tim ha notato utile, questo sembra essere collegato all'uso di Interface Builder sui display retina. Tutti gli sviluppatori che abbiamo avuto causa il problema hanno display retina, mentre quelli di noi senza display retina non hanno avuto il problema. L'implementazione interna, l'analisi e la riscrittura di XML, non sembrano gestire correttamente la precisione dei pixel. Quindi evitare di usare IB su un display retina è l'unica soluzione a questo punto fino a quando Apple risolverà questo bug. –
Questo mi sta facendo impazzire, con Xcode 9.1 ... Hai inserito un bug? –