【问题标题】:iOS - Overriding Trailing and leading space constraints(created in Interface Builder) in codeiOS - 在代码中覆盖尾随和前导空间约束(在 Interface Builder 中创建)
【发布时间】:2015-01-10 02:43:40
【问题描述】:

我有一个带有 4 个按钮及其相应标签的 UIView。它们当前位于视图的中心,中间的按钮具有适当的尾随和前导空间约束,因此它们之间始终存在定义的空间。

但是,现在当其中一个按钮被隐藏时(并且一次最多只隐藏两个中间按钮之一),按钮需要重新居中。我似乎无法删除与尾随和前导空格相关的约束,而没有 Interface Builder 到处乱吐,因为我不能只是没有子视图的约束,我只想覆盖按钮的所有约束(宽度和高度除外与尾随(和或)前导空格相关的按钮本身)。

作为没有视觉图片的例子

A----->B----->C----->D

这些是我的四个按钮,下面有标签(当然没有显示),它们之间有四个空格(但它们都在视图中居中)。如果 B 被隐藏,那么我想在视图中重新居中 A、C 和 D,但现在原始设置的尾随和前导空格当然已经过时,需要根据此示例重置。如果 C 被隐藏,那么我需要重新居中并重置 A、B 和 D 的约束,其中 B 需要在视图中居中,且 A 和 D 位于两侧,间距相同(四个空格)。

有没有办法在这样的代码中覆盖这些约束?似乎没有一种方法可以在 XCode 中设置条件约束(尽管那会很好),并且仍然没有一种方法可以删除子视图中的约束,以便您可以在代码中创建它们。

此解决方案需要支持 iOS 7 和 8,我不能只关闭自动布局,因为屏幕上其他视图中的其他元素使用约束。

有什么想法吗?想法?

【问题讨论】:

    标签: ios xcode interface-builder autolayout constraints


    【解决方案1】:

    直接的方法是重做你的约束。

    话虽如此,您是否需要重新显示隐藏按钮?如果没有,我看到的一种简单方法是添加一个低优先级约束,该约束应该在隐藏一个按钮时启动,而不是仅仅隐藏要隐藏的按钮,而是将其从其父视图中完全删除。

    假设如果按钮 B 可以隐藏,则在 A 和 C 之间添加一个水平间距约束,其优先级低于 B 的抗压优先级,并且当 B 隐藏时,A 和 C 之间的正确间距是常数。当您想隐藏 B 时,将其从其父视图中移除(有效地移除与其相关的约束),并且应该启动低优先级约束。

    【讨论】:

    • 是的,按钮可以再次显示。按钮 B 可以隐藏在中心 A、C 和 D 的位置。然后根据一堆东西,必须隐藏 C,然后我们显示 B,然后 A、B 和 D 必须以更新了约束。
    • 你必须以某种方式重做约束。但是使用上面的方法,您可以强烈引用按钮 B,以及有关它的约束。然后当你想隐藏它时仍然从它的超级视图中删除它,并在你想显示它时添加按钮 B 和它的约束。实际上,我没有考虑将按钮集中在他们的超级视图上。答案是保持按钮之间的距离。当现在仍然有四个可见时,您如何将它们居中?
    • 基本上是反复试验和手动移动按钮直到它看起来居中,然后更改约束以匹配 IB。中心实际上是按钮 B 和按钮 C 之间的中点,其中 A---->B---->C---->D 设置。 A 和 D 都有通往超级视图的前导空格,但显然我现在不能有,因为按钮 A 需要与 B 或 C 保持恒定间距,具体取决于隐藏哪个(这意味着前导空间需要动态更改)和按钮 D 也是如此。我可能不得不在代码中创建所有约束。
    • 是的,我想你必须重做它们。顺便说一句,您可以在代码中添加指向您在 IB 上设置的约束的 IBOutlets,这样您就可以处理它们并以编程方式更改它们的常量。
    • 所以我所做的是,我从按钮中删除了所有约束。然后在代码中将按钮和标签的 AutoresizingMaskIntoConstraints 设置为 YES 然后手动计算超级视图的中心点。现在您可以将其作为中心按钮 A 和 D 的参考点。希望这是有道理的。
    猜你喜欢
    • 2015-08-12
    • 2015-10-03
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多