Skip to content

2.1.0 重构 QMUIMoreOperationController 须知

MoLice edited this page Dec 4, 2017 · 1 revision

QMUI iOS 2.1.0 版本里我们重构了 QMUIMoreOperationController,由于改动较大,在此将重构思路及新版本适配方法一一列出。

存在问题

之前 QMUIMoreOperationController 存在的问题主要有:

  1. 最多只支持 2 行(Important 和 Normal)。
  2. 每一行显示的列数根据不同屏幕写死而不是动态计算,因此无法得到一个最优布局结果。
  3. QMUIMoreOperationController 负责创建 item,而不是 item 自己管理自己,导致 QMUIMoreOperationController 代码较为冗杂。
  4. 支持以 hidden 的方式临时将某个 item 隐藏起来,但该 item 又存在于 view 层级和数据里,这种不匹配加重了控件的复杂度。
  5. 事件响应依然使用 delegate,与 QMUIAlertControllerQMUIDialogViewController 等其他使用 block 风格的 QMUI 控件不一致。

优化点

基于以上问题,本次 QMUI 版本重构了这个控件,新控件相比旧控件的改动有:

  1. 通过 items 属性来设置 item,支持不定行数的 item。
  2. 动态计算每一行的 item 个数以及 item 与 item 之间的间距,使得业务可以较为自由地控制 item 的布局效果。
  3. QMUIMoreOperationItemView 自己负责创建 item 并管理自己的内容,使代码划分更清晰,风格与 QMUIAlertAction 一致。
  4. 去除 hidden 的操作,使用 remove 代替即可。
  5. 将事件从 delegate 改为 block 风格,与 QMUI 其他控件保持一致。

适配指南

如果你从 2.1.0 以前的版本升级上来,那么你需要做的修改是:

  1. 搜索 [QMUIMoreOperationController addItemWithTitle: 系列方法,将其删除。
  2. 将第 1 步里的 item 改为用 [QMUIMoreOperationItemView itemViewWithImage:] 系列方法创建。
  3. 如果 item 的点击事件响应较为独立,建议将原本写在 [QMUIMoreOperationControllerDelegate moreOperationController: didSelectItemAtIndex:] 里的事件迁移到第 2 步 init 方法的 handler 参数里(也可以不迁移,依然使用 delegate 管理点击事件)。
  4. 通过 items 属性一次性把所有 item 添加进去,或者通过新增的 addItemView:insertItemViewremoveItemView 系列方法来操作 item 的增删。
  5. 如果原本有使用 setItemHidden: 方法临时将 item 隐藏,则新版里应该将隐藏操作改为移除操作,现不提供隐藏 item 的概念。
  6. 全局搜索 QMUIMoreOperationControllerDelegate 里的两个方法:moreOperationController:didSelectItemAtIndex:type:moreOperationController:didSelectItemAtTag:,将其改为 moreOperationController:didSelectItemView:,或者考虑移除它们,换成用 handler 的方式组织事件响应代码。
  7. contentSeparatorColor 重命名为 scrollViewSeparatorColor
  8. topScrollViewInsetsbottomScrollViewInsets 替换为 scrollViewContentInsets
  9. 增加 contentPaddings 用于控制面板内部的间距。
  10. 增加 itemMinimumMarginHorizontal 用于保护 item 之间的间距不要小于某个值。