希望搞一次开放性的讨论,先描述问题:
在没有 autolayout 之前,我们在频繁变更 view 大小或者位置时,可以直接通过设置 view.frame,如:
view.frame = CGRectMake(x, y, width, height);
这是 view 的位置和大小都将按照最新的 frame 来展示。
但是,自从使用 autolayout 的最大困惑就是,autolayout 同一优先级的 constraint 不允许冲突,否则将会报错。所以如果一个 view 要频繁变更样式,不得不频繁的 addConstraint 和 removeConstraint,并且为了能够准确 removeConstraint,我们不得不在 addConstraint 时,保存 NSAutolayoutConstraint 的对象。
例如有这样的需求:
当键盘弹起时,我需要 view 的高度减小到 100.0;当键盘消失时,view 的高度变成 300.0。而现在的做法是,将高度 300 的 constraint 的优先级设定为 250 —— LOW,当键盘弹起时,我再给他 addConstraint,变成 300.0,优先级为 1000,同时缓存此 Constraint,并用一个 Dictionary 保存此 Constraint,记为 consHeight300,目的是为了在键盘消失时方便取出该对象,然后
[view removeConstraint:consHeight300];
这种频繁的新增到 Dictionary,然后 removeConstraint,而且你可能还要频繁的管理该 Dictionary 的值,我觉得其实非常麻烦,真心不如 frame 的方式。大家有什么好的办法么?是不是我们的做法有问题?
constraint 有一个唯一可以修改的属性 constant,我承认它的名字确实很具有迷惑性。。。
以题主提到的高度问题为例,可以保存这个高度 constraint 的引用,在键盘出现和收起时
如果是很复杂的 UI,constant 的修改不足以满足需求,那么频繁添加和移除 constraints 是不可避免的。但不得不说,这时候先要就 UI 设计小小做一下重新思考:)