Jef*_*art 65 floating-point interface-builder ios retina-display xcode6
我们有许多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"/>
Run Code Online (Sandbox Code Playgroud)
和
<rect key="frame" x="446.00000170260091" y="7" width="302" height="30"/>
|
V
<rect key="frame" x="446" y="7" width="302" height="30"/>
Run Code Online (Sandbox Code Playgroud)
和
<rect key="frame" x="364" y="3" width="200" height="38"/>
|
V
<rect key="frame" x="363" y="3" width="200" height="38"/>
Run Code Online (Sandbox Code Playgroud)
和
<rect key="frame" x="284" y="7" width="97" height="30"/>
| |
V V
<rect key="frame" x="283" y="7" width="96" height="30"/>
Run Code Online (Sandbox Code Playgroud)
和
<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"/>
Run Code Online (Sandbox Code Playgroud)
大多数情况下,帧维数的数字只会改变一小部分,要么整数值改变一个,要么浮点值被截断,或小数部分稍微改变.
其他时候,价值变化了几点,但是:
<rect key="frame" x="334" y="3" width="200" height="38"/>
|
V
<rect key="frame" x="331" y="3" width="200" height="38"/>
Run Code Online (Sandbox Code Playgroud)
和
<rect key="frame" x="251" y="7" width="223" height="30"/>
|
V
<rect key="frame" x="251" y="7" width="220" height="30"/>
Run Code Online (Sandbox Code Playgroud)
和
<rect key="frame" x="478" y="3" width="274" height="38"/>
| |
V V
<rect key="frame" x="475" y="3" width="276" height="38"/>
Run Code Online (Sandbox Code Playgroud)
请注意,当开发人员不打算对故事板进行单个更改时,所有这些示例框架更改都取自相同的示例提交.两个版本的文件之间的XML有269个差异,所有这些都是帧大小或位置的这些微小变化.故事板XML大约是9000行.
似乎这个问题可能与IB使用浮点数和舍入误差有关,并且几个像素的差异可能是这些舍入错误的聚合,在几次打开,解析和重新序列化的过程中数据.
这只是一个理论,因为我无法确定不必要的变化的确切原因.通常提交根本不对帧进行任何重大更改,只有微不足道的浮点更改,例如446.00000055262581 - > 446.00000112002783.但是当发生严重变化时,它们似乎大量出现.
发生更改的提交也由同一个开发人员使用相同版本的Xcode和Interface Builder进行.在此示例中,提交此数据的提交,例如,文档标记<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">
位于故事板文件的两个版本中.
除了确保检查不对故事板文件进行无意义或无意的更改之外,我还想缩小导致这些不必要的更改到故事板视图的原因.如果这是我们可以避免这样做导致问题,我们可以知道原因.
更新: 正如Tim所说,在视网膜显示器上使用Interface Builder时,似乎确实会出现此问题.引起问题的所有开发人员都拥有视网膜MacBook Pro.没有视网膜显示的我们这些人没有遇到过这个问题.
小智 21
这个谜中最有趣的线索是,当你在Retina显示屏上打开相同的故事板而不是非视网膜显示器时,它似乎特别糟糕.
起初,我在4k iMac和视网膜前Macbook pro之间来回走动,并且进行了大量的更改(每次更改约300行).
然后我只是将xcode窗口从我的主显示器(4k /视网膜)拖到我的第二台显示器(2560x1440,非视网膜) - 当窗口大小相同时,xcode调整了所有元素的大小并抱怨了~50个错位的视图.我将它移回视网膜显示器,大约一半"错位"的错误消失了,但一半仍然存在.正如您所建议的那样,重新缩放会降低基础数据.
如果你有多个开发人员在同一个文件上工作,这肯定会经常发生.
解决方案?这可能是苹果公司要纠正的 - 我没有遇到任何会减轻它的设置.
这似乎是与Interface Builder的CGFloat值序列化相关的错误.视图框的大小和位置值是浮点.但他们的价值观总是整数.内部图形操作要求它们是浮点,以使变换数学运行,但所有内容始终以圆整数点值表示.
当这些浮点值序列化到故事板XML时,IB通常将值序列化为整数,但偶尔也将它们序列化为浮点数.我不确定为什么它决定这样做,但它不太常见.在我上面的示例框架中,其中3个值最终为浮点数,而其他值为整数.
在我的例子中也可以看到,浮点表示通常会被改为序列化为整数.这是我相信找到错误的地方.
有一件事我注意到视图框架的变化方式,它们倾向于向左移动或缩小尺寸.因此价值观大多变小.您可以在我提供的示例中看到,这种情况总是如此.
浮点不具有精确表示整数值的精度,但精确到几个小数位.因此,虽然有时整数在我的示例中表示为略高于整数值(即384.00001078580522),但其他整数表示为略低于整数值.以下是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"/>
Run Code Online (Sandbox Code Playgroud)
虽然这种特殊的变化似乎并没有直接修改框架的价值.这两个数字基本上等于457.我认为发生的是当故事板再次打开时重新解析此XML时,它可能会截断456.99999985252464值并将其读取为456.这会导致值逐渐增加更小,缩小尺寸或将框架的位置向左或向上移动.
当然,这仅仅是一个理论,并没有给出Interface Builder为什么这样做的原因.它似乎从最近的Xcode 6发布开始.此外,它没有解释它是如何在一个例子中从8变为7.5,或者甚至是在我的上一个例子中从274变为276的一次.但在大多数情况下,大多数变化往往是向下的方向.
我正在向Apple提交一个错误,以便对此进行调查.
归档时间: |
|
查看次数: |
3011 次 |
最近记录: |