2014-10-27 73 views
57

我们有几个不同的开发者贡献的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"/> 

and

<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.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">

除了确保不对提交故事板文件提交不重要或无意的更改,我想缩小是什么导致这些不需要的故事板视图更改。如果这是我们可以避免造成问题的原因,我们可以意识到原因。

更新: 正如蒂姆指出的那样,这个问题似乎是在视网膜显示器上使用Interface Builder时造成的。所有造成问题的开发者都有视网膜MacBook Pro。我们这些没有视网膜显示器的人都没有遇到过这个问题。

回答

4

这似乎是一个与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"/> 

虽然这个特别的变化似乎并没有直接修改框的值。这两个数字基本上等于457.我认为发生的是当再次打开故事板时重新分析此XML时,它可能会截断456.99999985252464值并将其读取为456.然后,这会导致值逐步获得更小,缩小尺寸或将框架的位置向左或向上移动。

当然,这只是一个理论,并没有给出Interface Builder为什么这样做的原因。它似乎从最近的Xcode 6发布以来就已经开始了。另外,它并没有解释在一个例子中它是如何从8到7.5变化的,甚至也不是从最后一个例子中的274变为276。但大多数情况下,大部分变化趋于下降。

我正在申请一个与苹果有这个问题的bug。

+0

感谢杰夫的冗长解释,这也发生在我们身上。你有没有找到任何方法来避免这种情况? – celiker 2015-03-06 14:03:28

+1

@celiker正如Tim所说的,这似乎与在视网膜显示器上使用Interface Builder相关。我们所有的开发人员都会导致视网膜显示,而没有视网膜显示的人员则没有问题。内部实现,解析和重写XML,似乎没有正确处理像素精度。因此,在Apple修复此错误之前,避免在视网膜显示器上使用IB是目前唯一的解决方法。 – 2015-03-06 18:13:42

+0

这仍然让我疯狂,Xcode 9.1 ...你提交了一个bug吗? – 2017-12-15 15:09:02

17

这个谜题中最有趣的线索是,当您在Retina显示屏上打开相同的故事板而非非视网膜显示器时,它看起来特别糟糕。

起初我来回4K的iMac和预视网膜的MacBook Pro之间,并得到一个大的体积变化(约300行,每一次改变)。

然后,我只需将xcode窗口从我的主显示器(4k /视网膜)拖到我的第二个显示器(2560x1440,非视网膜) - 而窗口尺寸相同时,xcode调整了所有元素并投诉〜50错位的意见。我把它移回到视网膜显示器,大约一半的“错位”错误消失了,但一半仍然存在。重新缩放 - 如您所建议的那样 - 会降低底层数据。

如果你有多个开发人员在同一个文件上工作,这肯定会经常发生。

解决方案?苹果公司可能会纠正这一切 - 我还没有遇到任何会减轻它的设置。

+0

Pradeep K发现设置让Xcode忽略Retina显示模式http://stackoverflow.com/a/36124980/2064473尽管如此,就像他指出的那样,击败了使用Retina显示屏的重点。我禁用了该设置,因为我主要是在外部显示器上进行开发。 – Cyrus 2016-07-10 05:15:25

3

我可能对这个问题有一个答案。它在低分辨率模式下打开应用程序的知之甚少。我们最近有一个类似的问题,其中表格视图单元格的内容视图在分隔线设置为默认或单独时,高度为0.5高度。当它设置为None时,这个问题就不存在了。 步骤 1.将默认TVC拖到故事板。检查表格视图单元格的内容视图的高度。这将是43.5。 2.将表格视图的分隔线设置为无。的细胞变化的内容以44

现在退出Xcode和设定开在Finder中低分辨率模式获取信息窗口的Xcode的应用程序。现在,如果您按照上面的相同步骤操作,则会将表视图单元格的内容视图的高度显示为43.

当有不同的团队成员在视网膜和非视网膜显示器上工作时,您只需将故事板文件作为只是因为你在视网膜显示器中打开故事板而被修改。一种解决方法是打开低分辨率模式并开始工作。但是,尽管你没有改变任何东西,但是它却击败了具有视网膜显示的目的,但是比故事板标记为已修改的更好。

+0

在低分辨率模式下打开Xcode 8.2.1,然后打开故事板文件时,我仍然看到0.5增量。 – sethfri 2017-02-21 21:42:20

+0

Xcode 7.2.1。也没有为我工作。 – TalL 2017-02-27 08:46:38

相关问题