我不久前遇到了这个问题,当时我通过github从另一台计算机上提取了一些故事板更新。
每当我打开Xcode时,会发生什么事情,它需要永远加载,最终我会得到数十个,有时甚至是数百个错位的视图。这已经让我困扰了一年多,而且我真的只是经历了每一个警告,并设置框架是他们期望摆脱警告的。
我已经跟踪错误是使用Size类。事后来看,并不是真的需要他们。我们只是一个肖像应用,并没有打算实现景观功能。绝对不是很快。
问题是故事板在Any x Any中加载,然后切换到Compact x Regular,并且一堆视图放错了位置。
以下是一个错位视图的源代码:
<imageView userInteractionEnabled="NO" alpha="0.0" contentMode="top" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" misplaced="YES" image="SmallGreySwipeCircle" translatesAutoresizingMaskIntoConstraints="NO" id="jEr-aS-2Yb" userLabel="previousIcon">
<rect key="frame" x="70" y="187" width="180" height="194"/>
<constraints>
<constraint firstAttribute="width" constant="180" id="JSJ-EG-Mmh"/>
<constraint firstAttribute="height" constant="194" id="TJx-aa-8Cn"/>
</constraints>
<variation key="default">
<mask key="constraints">
<exclude reference="JSJ-EG-Mmh"/>
<exclude reference="TJx-aa-8Cn"/>
</mask>
</variation>
<variation key="heightClass=regular-widthClass=compact">
<mask key="constraints">
<include reference="JSJ-EG-Mmh"/>
<include reference="TJx-aa-8Cn"/>
</mask>
</variation>
</imageView>
要看的是两个<variation>
积木。
一个用于Any x Any,另一个用于常规压缩。
我怎样才能解决这个问题,以便保留我在Regular x Compact大小类上的所有约束,但是对Any x Any进行约束?
我手动执行此操作太多了,而且我不熟悉这种语言。 XAML? IDK。
看着它,我想猜测我可以将<exclude
改为<include
..在打破我的故事板之前,有没有人可以验证这个?
好的,所以这就是我发现的:
无论sizeclass如何,都会为每个项创建约束。但是,有一个<include.....>
和<exclude...>
设置,它们只包含在Size Inspector中创建/检查的大小类中。
我试着为<exclude
做一个查找/替换并将其设置为<include
。
问题在于它只包含所有约束。
一个切线问题是,当您创建一个对象并将其拖动到视图控制器中时,它只会被添加到该大小类中。您必须将其添加到所有其他人。这并不像交换'<include。这些仅添加到ViewController的每个大小类的实现中,因此将约束设置为<include
而不是<exclude
最终会为每个大小类中不存在的对象添加约束。
如果你的故事板不是太大,你只使用一个大小的类(即我的应用程序只是纵向模式,没有风景),解决这个问题的方法是去每个对象的大小检查器,并确保任何大小类是检查,并对其拥有的每个约束执行相同操作。
如果您使用多个大小类,我认为没有一种好方法可以解决此错误而不会引入意外行为。愿上帝怜悯你的灵魂。