Xcode 故事板 - 将我对特定大小 class 的所有约束转换为 Any x Any 的约束

Xcode Storyboard - Convert all of my constraints for a specific size class to the constraint for Any x Any

我 运行 不久前就遇到过这个问题,当时我通过 github 从另一台计算机上提取了一些故事板更新。

每次我打开 Xcode 时,都需要很长时间才能加载,最后我得到了几十个,有时是数百个错位的视图。这已经困扰我一年多了,我实际上只是仔细检查了每一个警告,并将框架设置为他们希望摆脱警告的框架。

我发现错误是使用大小 classes。事后看来,真的不需要他们。我们只是一个纵向应用程序,无意实现横向功能。绝对不会很快。

问题是 Storyboard 在 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 尺寸 class 的所有限制,但让它们成为 Any x Any 的所有限制?

手动操作太多了,而且我不熟悉这是什么语言。 XAML?同上。

看着它,我想我可以将 <exclude 更改为 <include.. 在我破坏我的故事板之前有人可以验证这个吗?

好的,这是我发现的:

无论大小如何,都会为每个项目创建约束条件class。但是,有一个 <include.....><exclude...> 设置,它们只包含在尺寸检查器中创建/检查的尺寸 class 中。

我试着为 <exclude 做一个 find/replace 并将其设置为 <include

问题是它只包含所有 约束

一个切线问题是,当您创建一个对象并将其拖到您的视图控制器中时,它只会被添加到该大小 class。您必须将它添加到所有其他的。这不像交换 '<include 而不是 <exclude 最终会为不存在的对象添加约束每个尺码 class.

如果您的故事板不是太大,并且您只使用一种尺寸 class(即我的应用只有纵向模式,没有横向模式),解决这个问题的一种方法是调整每个对象的尺寸inspector 并确保选中 Any size class,并对它具有的每个约束执行相同的操作。

如果您使用多种尺寸 classes,我认为没有一种好的方法可以在不引入意外行为的情况下解决此错误。愿上帝怜悯你的灵魂。