Skip to content

4.8.0

Latest
Compare
Choose a tag to compare
@MoLice MoLice released this 21 Sep 22:11

综述

该版本主要包含内网积累的若干更新,以及对 iOS 18.0 的基本兼容(也即能跑就行,细节 bug 的修复后续再说)。

新增功能

  1. QMUIBadgeProtocol 增加属性 qmui_badgeViewDidLayoutBlockqmui_updatesIndicatorViewDidLayoutBlock 允许业务方便地基于 QMUI 已有的角标布局去调整自定义的布局,以前只能通过 offset 值调整,而 offset 值在复杂场景通常很难计算出来。
  2. QMUIButton 增加 subtitle 系列属性以支持上下两行文本。
  3. 增加 QMUICheckbox 组件及其 Demo。
  4. 增加 QMUILayouter 组件及其 Demo 以实现一种简便的 CSS Flexbox 布局模型。
  5. QMUIModalPresentationViewController 增加属性 shouldBecomeKeyWindow,允许业务升起一个非 keyWindow 的浮层,避免影响已有界面的键盘显隐(例如 QMUIDemo 里的
    QMUIDropdownNotification 应用内顶部下拉通知条则关闭了该属性,从而避免当键盘正在显示时来了一个顶部通知,会把键盘强制降下去的问题)。
  6. QMUINavigationTitleView 增加 padding 属性用于调整布局,增加 adjustsSubviewsWhenHighlighted 属性用于屏蔽默认的点击高亮表现。
  7. QMUIPopupContainerView 增加 preferLayoutAlignmentusesOppositeLayoutAlignmentIfNeeded 属性用于控制浮层对准目标位置时,与目标位置的左右对齐方式。
  8. QMUIPopupContainerView 增加 setNeedsUpdateLayout 方法代替原有的 updateLayout,用于避免同一个 runloop 内重复刷新布局的问题。
  9. QMUIPopupContainerView 增加 showingAnimationBlockhidingAnimationBlock 属性以供业务自定义自己的显隐动画。
  10. QMUISearchController 增加 initWithContentsViewController: resultsViewController: 方法、searchResultsController 属性允许业务自定义搜索结果界面。
  11. QMUISearchController 增加 supportsSwipeToDismissSearch 属性用于支持侧滑手势退出搜索。
  12. 增加 QMUISheetPresentation 组件用于支持类似微信内临时的半屏聊天界面、视频号评论区那种半屏浮层,可在显示半屏浮层的同时以普通 push 的方式打开下一级界面,这是区别于 QMUIModalPresentationViewController 的关键点。
  13. QMUITextView 增加属性 isDeletingDuringTextChange 用于在文本发生变化时判断当前是否正在删除。
  14. QMUIHelper 增加 isDynamicIslandDevice 属性用于区分当前设备是否拥有灵动岛。
  15. QMUIHelper 增加 baselineOffsetWhenVerticalAlignCenterInHeight:withFont: 方法,用于计算出能让指定字体在给定行高内垂直居中的 baselineOffset 值。
  16. NSAttributedString (QMUI) 增加 qmui_textAlignment 属性用于便捷地获取/修改富文本里的文字对齐方式,增加 qmui_applyParagraphStyle: 方法用于便捷地修改富文本里的段落样式。
  17. 增加 NSRegularExpression (QMUI) 分类,支持正则对象的缓存(因为正则对象的创建是个耗时操作),以优化高频使用正则表达式场景的性能。
  18. UIImage (QMUI) 增加属性 qmui_name 以获取图片在 ImageAsset 里的命名。
  19. UIScrollView (QMUI) 增加方法 qmui_scrollToRect:atPosition:animated: 以方便地控制滚动位置。
  20. UISearchBar (QMUI) 增加属性 qmui_adjustTextFieldLayoutForIndexBar 用于控制当 UITableView 显示右边的 A-Z 索引条时,搜索框内的输入框是否要自动调整布局以避免与索引条重叠的特性。
  21. UISearchController (QMUI) 增加属性 qmui_alwaysShowSearchResultsController 用于实现即便搜索框文本为空依然可以一直显示搜索结果界面的功能(系统默认是搜索文本不为空才显示)。
  22. UITableViewCell (QMUI).qmui_accessoryView 现在支持获取到系统的排序按钮等控件。
  23. UITextView (QMUI) 增加 qmui_updateContentSize 方法以刷新内容尺寸。
  24. UIWindow (QMUI) 增加 qmui_canBecomeKeyWindowqmui_canResignKeyWindowBlock 用于控制 window 的 key 状态。

会带来 QMUI 新旧版本兼容问题的更新

  1. QMUIAlertController 的成员变量 _maskView 重命名为 _dimmingView,属性 shouldRespondMaskViewTouch 重命名为 shouldRespondDimmingViewTouch
  2. QMUIToastView 的属性 maskView 重命名为 dimmingView
  3. QMUIBadgeProtocol 里的 qmui_badgeLabel 重命名为 qmui_badgeView,且类型从 QMUILabel 改为更通用的 UIView,也即支持自定义 View 作为角标。
  4. 重构 QMUIPopupMenuView 组件,内部改为 UITableView 的实现,以满足大数据量场景下的性能要求,同时内置单选、多选模式及对应的 UI 表现,具体请查看 QMUI Demo 的新示例。
  5. - [NSArray qmui_mapWithBlock:] 方法增加 index 参数。
  6. 删除 - [UIActivityIndicatorView initWithActivityIndicatorStyle: size:] 方法,改为通过 hook 来实现以普通 setFrame: 方式调整其尺寸。
  7. 配置表 NavBarTitleColor 的生效范围从 QMUINavigationTitleView 类型的 titleView 扩大为 UIView.qmui_useAsNavigationTitleView == YES
  8. 配置表删除废弃的 badgeCenterOffsetbadgeCenterOffsetLandscapeupdatesIndicatorCenterOffsetupdatesIndicatorCenterOffsetLandscape

如何适配新版

  1. 若项目内有继承自 QMUIAlertController 的子类,请检查是否有用到成员变量 _maskView,若有,则重命名为 _dimmingView
  2. 全局搜索“shouldRespondMaskViewTouch”,将其改为“shouldRespondDimmingViewTouch”。
  3. 全局搜索用到 QMUIToastView.maskView 的地方,将其改为 dimmingView
  4. 全局搜索“qmui_badgeLabel”,将其改为“qmui_badgeView”。
  5. 由于 QMUIPopupMenuView 整个重写,带来大量的类型、接口变更,在此无法一一列出适配方式,所以请直接参考 QMUI Demo 的写法,自行修改,遇到不清楚的可提 Issue。
  6. 全局搜索“qmui_mapWithBlock”将用到的地方改为新的带 index 参数的 block。
  7. 全局搜索用到 - [UIActivityIndicatorView initWithActivityIndicatorStyle: size:] 的地方,将其改为普通的 init。
  8. 若有使用配置表,请观察界面的顶部 titleView 颜色是否保持与更新前一致。
  9. 若有使用配置表,请不区分大小写地搜索“badgeCenterOffset”、“badgeCenterOffsetLandscape”、“updatesIndicatorCenterOffset”、“updatesIndicatorCenterOffsetLandscape”,将用到的地方改为 badgeOffsetbadgeOffsetLandscapeupdatesIndicatorOffset updatesIndicatorOffsetLandscape

Bugfix

  1. #1542 修复特殊字符可能引发的 substring crash。
  2. #1557 修复因与系统 UIView.maskView 属性重名,导致 Xcode 16、iOS 18 运行 QMUI 可能命中系统断言的 bug。
  3. 修复 QMUIKeyboardManager 获取键盘所在 view、window 方法的 bug。
  4. 修复 QMUITextField.maximumTextLength 当光标在文本中间时,触发长度限制裁剪文本,会把文本末尾的文字裁剪(预期应该是光标前面的文本)的 bug。
  5. 修复 flat 系列函数因浮点精度问题导致无法计算出最接近的像素整数值的 bug。
  6. 优化 QMUIHelper.deviceModel 方法的实现方式,避免频繁获取值,以满足隐私合规的要求。
  7. 修复 QMUIHelper.navigationBarMaxYConstant 在灵动岛设备上返回值错误的 bug。
  8. 修复 QMUIStringPrivate 里提供的若干 substring 的方法在某些场景无法正确返回 NSAttributedString 类型的 bug。
  9. 修复设置了 UILabel (QMUI).qmui_lineHeight 属性后文字无法正确垂直居中的 bug。
  10. 修复 UINavigationController (QMUI).qmui_rootViewController 属性在某些极端场景下可能得到错误返回值的 bug。
  11. 修复 UIViewController (QMUI).qmui_previousViewController 属性在某些极端场景下可能得到错误返回值的 bug。
  12. 修复 UIScrollView (QMUI).qmui_alreadyAtBottom 可能因浮点精度问题导致返回值错误的 bug。
  13. 修复 UISlider (QMUI) 可能获取 step 位置错误的 bug。
  14. 修复 UITabBarItem (QMUI).qmui_doubleTapBlockUITabBarItem.title 变化时无效的 bug。
  15. 修复 UITabBarItem (QMUI).qmui_doubleTapBlock 在 iOS 18 下无效的 bug。
  16. 修复设置过 qmui_separatorInsetsBlock 再置为 nil 后可能出现的 crash。