界面生成器降级故事板,以小增量调整视图大小并重新定位视图

我们有几个不同的开发者贡献的一些iOS应用程序。 我仍然注意到的一个问题是,我们的故事板中的视图将从其被放置或resize的位置移出,以使它们更小,当标签全部是一个标签时,突然间正在截断他们的文字。

我注意到,当开发人员没有直接对故事板进行任何编辑时,我们的视图的这些降级出现在我们的Git存储库的提交中。 他们可能已经在界面生成器中查看了故事板,但是并没有对故事板做任何真正的改变。 尽pipe如此,这些改变还是被保存下来,并与他们正在进行的工作一起承诺。

当我在负责任的提交之前和之后的故事板文件之间进行文本比较的时候,我看到了很小的变化来查看框架,比如:

<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"/> | | VV <rect key="frame" x="283" y="7" width="96" height="30"/> 

 <rect key="frame" x="384.00001078580522" y="7" width="101" height="30"/> | | VV <rect key="frame" x="383.00000530853856" y="7" width="100" height="30"/> 

大多数情况下,帧尺寸的数字只是less量变化,整数值变化一个或浮点数值被截断或小数部分变化较小。

其他时候,这些数值正在改变几个点,虽然如下:

 <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"/> | | VV <rect key="frame" x="475" y="3" width="276" height="38"/> 

请注意,当开发人员不打算对故事板进行单一更改时,所有这些示例框架更改均取自相同的示例提交。 文件的两个版本之间的XML有269个差异,它们都是帧大小或位置的轻微变化。 故事板XML是~9000行。

似乎这个问题可能与IB使用浮点数和舍入错误有关,并且由几个像素变成的差异可能是在几次打开,parsing和重新序列化期间这些舍入错误的集合数据。

这只是一个理论,因为我无法确定不需要的变化的确切原因。 通常的做法是根本不对帧做任何重大的改变,只有微不足道的浮点数变化,如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。 我们这些没有视网膜显示器的人还没有经历过这个问题。

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

起初,我在4k iMac和一个视网膜前的Macbook pro之间来回走动,并获得了大量的变化(每次修改约300行)。

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

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

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

这似乎是一个与Interface Builder的CGFloat值序列化有关的错误。 视图帧的大小和位置值是浮点数。 但是他们的价值观总是整数。 内部graphics操作要求它们是变换math运算的浮点数,但是一切总是用圆整点值表示。

当这些浮点值被序列化为故事板XML时,IB通常将这些值序列化为整数,但是偶尔也会将它们序列化为浮点数。 我不确定为什么这样做的决定是这样做的,但不太常见。 在我上面的示例框架中,其中三个值是浮点数,而另一些是整数。

在我的例子中也可以看到,经常浮点表示将被改为被序列化为一个整数。 这是我相信错误被发现的地方。

有一件事,我注意到视图框架的方式正在改变,他们倾向于左移或缩小。 所以价值大都变小了。 你可以在我提供的例子中看到,这是最常见的情况。

浮点没有精确地表示整数值,但是精确到小数点后几位。 所以虽然有时整数在我的例子中被表示为略高于整数值(即384.00001078580522),但其他expression式则略低于整数值。 以下是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个。 但是,大部分的变化往往是向下的。

我正在向苹果提交一个漏洞,让这个问题得到解决。

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

现在退出Xcode,并在Xcode应用程序的Finder Get Info窗口中设置Open in Low Resolution模式。 现在,如果您按照上述相同的步骤,它将显示表视图单元格的内容视图的高度为43。

当有不同的团队成员在视网膜和非视网膜显示器上工作时,仅仅因为您在视网膜显示器中打开了故事板就可以简单地获取故事板文件。 一种解决方法是打开低分辨率模式下的工作。 但是,尽pipe你没有改变任何东西,但是它却击败了具有视网膜显示的目的,但是比标记为已修改的故事板更好。