开发者社区> 问答> 正文

关于 autolayout 需要频繁变更的讨论

希望搞一次开放性的讨论,先描述问题:

在没有 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 的方式。大家有什么好的办法么?是不是我们的做法有问题?

展开
收起
a123456678 2016-07-27 15:58:42 2011 0
1 条回答
写回答
取消 提交回答
  • constraint 有一个唯一可以修改的属性 constant,我承认它的名字确实很具有迷惑性。。。
    以题主提到的高度问题为例,可以保存这个高度 constraint 的引用,在键盘出现和收起时

    • (void)keyboardDidShowNotification
      {

      self.viewHeightConstraint.constant = 100.f;
      [self.myView layoutIfNeed];

      }

    • (void)keyboardDidHideNotification
      {

      self.viewHeightConstraint.constant = 300.f;
      [self.myView layoutIfNeed];

      }

    如果是很复杂的 UI,constant 的修改不足以满足需求,那么频繁添加和移除 constraints 是不可避免的。但不得不说,这时候先要就 UI 设计小小做一下重新思考:)

    2019-07-17 20:00:45
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
快速变化背景下,组织如何保持过程的稳定性 立即下载
快速变化背景下,组织如何保持过程的稳定性? 立即下载
动态、高效,蚂蚁动态卡片的内核逻辑 立即下载