【问题标题】:Autolayout: Relative but changeable/animatable constraints?自动布局:相对但可变/可动画的约束?
【发布时间】:2016-02-19 00:59:22
【问题描述】:

对于具有您希望经常更改的相对值的约束,是否有推荐的模式?

以下是场景:我有一个类似滑块的控件,我将拇指视图相对于其父视图的宽度进行定位。我可以轻松地为此创建一个相对约束:将子视图约束到其父视图的相对边缘,并使用乘数设置其相对位置。

问题是拇指视图需要移动:当用户滑动它时,它的相对位置需要改变。如果可以动态更改乘数,那将是解决方案。但是,NSLayoutConstraint.multiplier 是只读属性!

另一种方法是将.constant 值设置为相对于父级宽度的显式值。但是,如果父视图的大小发生变化,这就会崩溃——在更新周期的适当点捕捉视图宽度的变化以更新约束是很棘手的。

有没有更好的方法来做到这一点?似乎应该是可能的,但我还没有完全概念化苹果的思考方式......

有什么想法吗?谢谢!

【问题讨论】:

    标签: ios autolayout uiviewanimation nslayoutconstraint


    【解决方案1】:

    当用户滑动它时,它的相对位置需要改变。

    然后在用户拖动时以正常方式(通过更改视图的框架/中心)更改其位置。这就是如何实现可拖动视图:当用户执行触摸手势时,你不断改变它的框架/中心。这工作得很好;您可能在定位此“拇指”视图时受到限制这一事实是无关紧要的。

    只有当layout出现时才会出现问题;那时,如果您有自动布局约束,它们将接管。如果它们与拇指的当前位置不匹配,它将跳回到原来的位置。你不想要那个!所以你有两种简单的可能性:

    • 不要使用约束来定位/调整这个“拇指”。并非层次结构中的每个视图都必须使用自动布局。

    • 如果您确实使用约束来定位/调整“拇指”的大小(我可以理解您可能想要这样做的原因),那么 之后用户移动了拇指(这实际上意味着你已经通过设置它的框架/中心来改变它的“拇指”位置,正如我已经说过的),用匹配它的新位置的新约束替换它的位置约束。

    换句话说,仅将约束视为它们的本质,一组用于在布局时设置视图的框架/中心的编码指令。他们可以而且应该得到灵活的对待。视图可以从自动布局的影响中移除,直接操作,然后返回到该影响。或者甚至可以暂时忽略自动布局的影响,因为在布局的特殊时刻到来之前它没有任何区别并且没有效果。换句话说,不要让自己被自己的束缚所束缚!

    【讨论】:

    • 对——我可以在没有自动布局的情况下实现这一点。但是,重点是我想要使用自动布局。我发现在同一代码中混合自动布局和非自动布局方法会很快变得棘手。当拇指移动时,我可以反复删除并重新创建位置约束,但我怀疑在某些情况下会出现故障;我认为约束只打算创建一次。关于纯自动布局方法的任何想法? :)
    • 您已经成功地在交互式、快速移动的视图在移动时交换了约束?我对这种方法持怀疑态度。设置约束有开销;我不认为这是你想在一个紧密的循环中做的事情。
    • 是的,我阅读了您的回答。澄清一下,我正在寻找一种纯粹的自动布局方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多