Wir haben eine Reihe von iOS-Apps, zu denen verschiedene Entwickler beitragen. Ein Problem, das ich weiterhin bemerke, ist, dass Ansichten in unseren Storyboards aus der Position verschoben werden, in der sie platziert wurden, oder die Größe geändert werden, sodass sie kleiner sind plötzlich kürzen sie ihren Text.
Ich stelle fest, dass diese Verschlechterungen unserer Ansichten in Commits für unser Git-Repository angezeigt werden, wenn der Entwickler keine direkten Änderungen am Storyboard vorgenommen hat. Möglicherweise haben sie das Storyboard in Interface Builder angezeigt, aber keine wirklichen Änderungen am Storyboard vorgenommen. Die Änderungen wurden dennoch gespeichert und zusammen mit dem, woran sie arbeiteten, festgeschrieben.
Wenn ich vor und nach den verantwortlichen Commits einen Textvergleich zwischen den Storyboard-Dateien durchführe, werden kleine Änderungen an den Ansichtsrahmen angezeigt, z.
<rect key="frame" x="203" y="8" width="362" height="29"/>
|
V
<rect key="frame" x="203" y="7.5" width="362" height="29"/>
und
<rect key="frame" x="446.00000170260091" y="7" width="302" height="30"/>
|
V
<rect key="frame" x="446" y="7" width="302" height="30"/>
und
<rect key="frame" x="364" y="3" width="200" height="38"/>
|
V
<rect key="frame" x="363" y="3" width="200" height="38"/>
und
<rect key="frame" x="284" y="7" width="97" height="30"/>
| |
V V
<rect key="frame" x="283" y="7" width="96" height="30"/>
und
<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"/>
Meistens ändern sich die Zahlen für die Rahmenabmessungen nur geringfügig, entweder ändert sich ein ganzzahliger Wert um eins oder ein Gleitkommawert wird abgeschnitten oder der Dezimalteil wird geringfügig geändert.
In anderen Fällen ändern sich die Werte jedoch um einige Punkte wie folgt:
<rect key="frame" x="334" y="3" width="200" height="38"/>
|
V
<rect key="frame" x="331" y="3" width="200" height="38"/>
und
<rect key="frame" x="251" y="7" width="223" height="30"/>
|
V
<rect key="frame" x="251" y="7" width="220" height="30"/>
und
<rect key="frame" x="478" y="3" width="274" height="38"/>
| |
V V
<rect key="frame" x="475" y="3" width="276" height="38"/>
Beachten Sie, dass alle diese Beispiel-Frame-Änderungen aus demselben Beispiel-Commit übernommen wurden, als der Entwickler nicht beabsichtigte, eine einzige Änderung am Storyboard vorzunehmen. Es gab 269 Unterschiede im XML zwischen den beiden Versionen der Datei, allesamt geringfügige Änderungen der Frame-Größen oder -Positionen. Das Storyboard-XML besteht aus ~ 9000 Zeilen.
Es scheint, dass das Problem möglicherweise etwas mit der Verwendung von Gleitkommazahlen und Rundungsfehlern durch IB zu tun hat. Die Unterschiede, die sich um einige Pixel verringern, könnten eine Aggregation dieser Rundungsfehler über einen Zeitraum von mehrmaligem Öffnen, Parsen und erneuter Serialisierung sein die Daten.
Dies ist jedoch nur eine Theorie, da ich die genaue Ursache der unerwünschten Änderungen nicht genau bestimmen konnte. Oft nehmen Commits überhaupt keine wesentlichen Änderungen an den Frames vor, sondern nur unbedeutende Gleitkommaänderungen wie 446.00000055262581 -> 446.00000112002783. Aber wenn die gravierenden Veränderungen eintreten, scheinen sie in großer Zahl aufzutreten.
Die Commits, zwischen denen die Änderungen vorgenommen werden, werden ebenfalls von demselben Entwickler mit derselben Version von Xcode und Interface Builder vorgenommen. In diesem Beispiel-Commit, in dem diese Daten erfasst wurden, befindet sich das Dokument-Tag beispielsweise <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 beiden Versionen der Storyboard-Datei.
Abgesehen davon, dass Sie sicherstellen, dass keine unbedeutenden oder unbeabsichtigten Änderungen an Storyboard-Dateien vorgenommen werden, möchte ich eingrenzen, was diese unerwünschten Änderungen an unseren Storyboard-Ansichten verursacht. Wenn wir vermeiden können, dass dies das Problem verursacht, können wir uns der Ursache bewusst sein.
Update: Wie Tim hilfreich bemerkte, scheint dieses Problem bei der Verwendung von Interface Builder auf einem Retina-Display verursacht zu werden. Alle Entwickler, die das Problem verursacht haben, haben Retina MacBook Pros. Diejenigen von uns ohne Retina-Displays haben das Problem nicht erlebt.