У нас есть ряд приложений для 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"/>
Обратите внимание, что все эти примерные изменения фрейма были взяты из того же примера commit, когда разработчик не намеревался сделать одно изменение в раскадровке. В XML между двумя версиями файла было 269 различий, и все они были такими незначительными изменениями в размерах или позициях кадра. XML раскадровки составляет ~ 9000 строк.
Кажется, что проблема может иметь какое-то отношение к использованию ИБ чисел с плавающей запятой и ошибок округления, а различия, которые становятся на несколько пикселей, могут быть совокупностью этих ошибок округления в течение нескольких раз, открывая, анализируя и повторная сериализация данных.
Это всего лишь теория, хотя я не смог точно определить причину нежелательных изменений. Часто фиксации вообще не вносят каких-либо существенных изменений в фреймы, только незначительные изменения с плавающей запятой, такие как 446.00000055262581 → 446.00000112002783. Но когда происходят серьезные изменения, они, похоже, происходят в большом количестве.
Комиты, между которыми происходят изменения, также создаются одним и тем же разработчиком, используя ту же версию Xcode и Interface Builder. В этом примере commit, где были сделаны эти данные, тег документа <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">
в обеих версиях файла раскадровки, например.
Кроме того, что я не хочу проверять, чтобы не совершать незначительные или непреднамеренные изменения в файлах раскадровки, я хотел бы сузить, что вызывает эти нежелательные изменения в наших представлениях раскадровки. Если это то, что мы можем избежать, это вызывает проблему, мы можем знать причину.
Update: Как Тим с благодарностью отметил, эта проблема, похоже, вызвана при использовании Interface Builder на экране сетчатки. Все разработчики, которые вызвали эту проблему, имеют сетчатку MacBook Pro. Те из нас, кто не видел сетчатки, не испытывали проблемы.