Autolayout:相对但可变的/可动画的约束?

时间:2016-02-19 00:59:22

标签: ios autolayout uiviewanimation nslayoutconstraint

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

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

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

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

有更好的方法吗?似乎它应该是可能的,但我还没有完全概念化Apple的思考方式...

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

  

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

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

只有在出现布局时才会出现问题;此时,如果您有自动布局限制,他们将接管。如果它们与拇指的当前位置不匹配,它将跳回原来的位置。你不希望这样!所以你有两个简单的可能性:

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

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

换句话说,考虑约束仅仅是它们是什么,用于在布局时设置视图的帧/中心的编码指令集。他们可以而且应该灵活对待。可以从自动布局的影响中删除视图,直接操作,然后返回到该影响。或者自动布局的影响甚至可以暂时忽略,因为它没有任何区别,并且在布局的特殊时刻出现之前没有任何影响。换句话说,不要让自己受到自己约束的束缚!