菜鸟教程小白 发表于 2022-12-12 15:03:09

ios - 在容器 View 约束集合上使用 activateConstraints 时出错


                                            <p><p>在我使用尺寸类的 iOS 8 应用程序中,为了让 iPad 具有不同的纵向和横向布局,我为激活和停用的每个方向设置了一个 <code>IBOutletCollection</code>。在引入 Container View 之前,这一直很有效。</p>

<p>我正在添加一个新的 VC,它是 iPhone 版本中的一个单独的选项卡项,但我使用容器 View 将它嵌入到 iPad 布局中。我将只关注一个大小类,RegularRegular。容器 View 有 4 个约束:Trailing、Leading、Top 和 Bottom。当我运行应用程序时,它看起来很好(在那个单一方向上)。</p>

<p>现在,当我将这 4 个约束添加到我的 <code>IBOutletCollection</code> 时,<code>activateConstraints</code> 消息失败并显示以下错误消息:</p>

<p>*** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“无法使用项目激活约束;层 = ;内容偏移:{0, 0}; contentSize: {460, 78}> 和 > 因为它们没有共同的祖先。约束是否引用不同 View 层次结构中的项目?这是非法的。'</p>

<p>约束不引用不同 View 层次结构中的项目。 Top、Bottom 和Leading 都与VCView 中的另一个 View 相关。 Trailing 与 VC 认为的步进器有关。因此,据我所知,它们都处于同一等级。 </p>

<p>在调试时,我可以看到约束以 <code>active</code> 属性作为 <code>nil</code> 开始。这似乎是正常的(非容器约束在设置为 <code>YES</code> 之前开始相同)。我通过设置 <code>active</code> 属性的 for 循环检查了这一点。</p>

<p>我对容器 View 的约束有什么问题吗?容器 View 上的约束是否因为它们位于容器 View 上而有些特殊?我试过自己找到答案,但我似乎找不到关于我遇到的这个问题的任何东西。 </p>

<p>任何帮助将不胜感激。</p>

<p><em>4/10 编辑以提供图片和代码。请注意,此时我已将容器约束分解为一个单独的数组,以便我可以自己处理它们。</em> </p>

<p>在下图中,容器的Leading、Top 和Bottom 约束与容器右侧的 View 相关。尾随约束与其上方的步进器有关。
<img src="/image/5xqts.png" alt="VC Layout"/> </p>

<p>相关代码:</p>

<pre><code>@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *regularAnyConstraints;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *regularAnyContainerConstraints;

@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *anyRegularConstraints;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *anyRegularContainerConstraints;
</code></pre>

<p>这些是 <code>_anyRegularContainerConstraints</code> 数组中的约束:
<img src="/image/Oc9uy.png" alt="_anyRegularContainerConstraints"/> </p>

<pre><code>;
;

;
;
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><blockquote>
<p>When in debug, I can see that the constraint starts off with its active property as nil</p>
</blockquote>

<p>这句话让我怀疑你是否误解了 <code>activateConstraints</code> 和 <code>deactivateConstraints</code> 的作用。尽管他们的名字和文档中的误导性条目,他们实际上添加和删除了约束。因此,与其对这些命令感到困惑,我建议您最好直接调用 <code>addConstraints</code> 和 <code>removeConstraints</code>。这样做的好处是:</p>

<ul>
<li><p>后者是 UIView 方法,因此您将有意识地控制添加约束的 View 。</p></li>
<li><p>删除时,如果您想稍后再次使用已删除的约束,您将清楚自己的责任。</p></li>
</ul>

<p>我意识到这并不能直接回答您的问题,但您没有为此提供足够的信息(您没有显示调用 <code>activateConstraints</code> 和 <code>deactivateConstraints</的代码</code>,您没有显示 ViewController 和 View 层次结构等的任何图表),因此尚不完全清楚您哪里出错了。相反,我试图让您在尝试解决问题的细节时重新调整您的<em>思维</em>。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在容器 View 约束集合上使用 activateConstraints 时出错,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/29552152/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/29552152/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在容器 View 约束集合上使用 activateConstraints 时出错