我们有很多 iOS 应用程序,由几个不同的开发人员贡献。我一直注意到的一个问题是,在我们的 storyboard 中,视图会移动或缩小,导致原来为适应文本大小的标签突然出现了截断文本的情况。
我注意到这些视图的退化出现在提交到我们 Git 存储库中的提交中,而开发人员并没有直接对 storyboard 进行任何编辑。他们可能在 Interface Builder 中查看了 storyboard,但没有对 storyboard 进行任何实际更改。尽管如此,更改仍然被保存并与他们正在处理的内容一起提交。
当我在受影响的提交前后的 storyboard 文件之间进行文本比较时,我看到了视图框架的小变化,例如:
<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"/>
请注意,这些示例帧更改都是从同一个提交中获取的,当开发人员没有意图对Storyboard进行任何更改时。两个文件版本之间的XML有269个差异,所有这些差异都是框架大小或位置的轻微更改。Storyboard XML大约有9000行。看起来问题可能与IB使用的浮点数和舍入误差有关,而变得不同的几个像素可能是在多次打开、解析和重新序列化数据的过程中这些舍入误差的聚合。这只是一种理论,因为我还没有能够确定不想要的更改的确切原因。通常,提交根本不会对框架产生任何重大更改,只会产生微不足道的浮点更改,例如446.00000055262581->446.00000112002783。但是当发生严重更改时,它们似乎会大量发生。
更改发生在同一开发人员使用相同版本的Xcode和Interface Builder创建的提交之间。在此示例提交中获取此数据时,文档标记在Storyboard文件的两个版本中都为``。
除了确保不提交对Storyboard文件的微不足道或意外更改之外,我希望缩小是什么导致了我们故事板视图中这些不想要的更改。如果有什么我们可以避免做,从而导致此问题,我们就可以意识到原因。
更新: 正如Tim热心地指出的那样,使用视网膜显示器在Interface Builder上使用时会导致此问题。所有造成问题的开发人员都有视网膜MacBook Pro。没有视网膜显示器的人没有遇到过这个问题。