我们有几个不同的开发者贡献的许多 iOS 应用程序。我不断注意到的一个问题是,我们故事板中的视图会偏离原来的位置,或者调整大小,使其更小,这在标签上的大小适合文本,最初变得痛苦地明显,当标签突然截断他们的文本。
我注意到,当开发人员没有直接对故事板进行任何编辑时,我们的视图的这些退化就会出现在对 Git 存储库的提交中。他们可能已经在 Interface Builder 中查看了故事板,但是并没有对故事板做出任何真正的改变。然而,这些更改与它们正在进行的工作一起被保存和提交。
当我在提交之前和之后对故事板文件进行文本比较时,我发现视图框架有一些小的变化,比如:
<rect key="frame" x="203" y="8" width="362" height="29"/>
|
V
<rect key="frame" x="203" y="7.5" width="362" height="29"/>
还有
<rect key="frame" x="446.00000170260091" y="7" width="302" height="30"/>
|
V
<rect key="frame" x="446" y="7" width="302" height="30"/>
还有
<rect key="frame" x="364" y="3" width="200" height="38"/>
|
V
<rect key="frame" x="363" y="3" width="200" height="38"/>
还有
<rect key="frame" x="284" y="7" width="97" height="30"/>
| |
V V
<rect key="frame" x="283" y="7" width="96" height="30"/>
还有
<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"/>
大多数情况下,帧尺寸的数字只会发生很小的变化,要么整数值变化一个,要么浮点数值被截断,要么小数部分发生微小的变化。
其他时候,这些数值也会发生一些变化,比如:
<rect key="frame" x="334" y="3" width="200" height="38"/>
|
V
<rect key="frame" x="331" y="3" width="200" height="38"/>
还有
<rect key="frame" x="251" y="7" width="223" height="30"/>
|
V
<rect key="frame" x="251" y="7" width="220" height="30"/>
还有
<rect key="frame" x="478" y="3" width="274" height="38"/>
| |
V V
<rect key="frame" x="475" y="3" width="276" height="38"/>
请注意,所有这些示例框架更改都来自同一个示例提交,当开发人员不打算对故事板进行单一更改时。这两个版本的文件在 XML 中有269处不同,所有这些都是在帧大小或位置上的细微变化。故事板 XML 大约有9000行。
看起来这个问题可能与 IB 使用浮点数和舍入错误有关,几个像素之间的差异可能是这些舍入错误在数次打开、解析和重新序列化数据期间的聚合。
这只是一个理论,因为我还不能准确地指出不必要的变化的原因。通常情况下,提交根本不会对帧做出任何重大更改,只会对浮点数做出微不足道的更改,如446.0000055262581-> 446.0000112002783。但是,当严重的变化发生时,它们似乎大量出现。
更改之间的提交也是由同一开发人员使用相同的 Xcode 版本和 Interface Builder 进行的。在这个示例中,提交数据所在的位置,例如,在故事板文件的两个版本中,document 标记都是 <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">
。
除了确保不要对故事板文件进行无关紧要或意外的更改之外,我还想缩小导致故事板视图发生这些意外更改的原因。如果是我们可以避免做的事情导致了这个问题,我们可以意识到原因。
更新: 正如提姆指出的那样,这个问题似乎确实是在视网膜显示器上使用 Interface Builder 时引起的。所有导致这个问题的开发者都有 Retina MacBook Pro。我们这些没有视网膜显示器的人没有经历过这个问题。