综述
该版本主要包含内网积累的若干更新,以及对 iOS 18.0 的基本兼容(也即能跑就行,细节 bug 的修复后续再说)。
新增功能
QMUIBadgeProtocol增加属性qmui_badgeViewDidLayoutBlock、qmui_updatesIndicatorViewDidLayoutBlock允许业务方便地基于 QMUI 已有的角标布局去调整自定义的布局,以前只能通过 offset 值调整,而 offset 值在复杂场景通常很难计算出来。QMUIButton增加subtitle系列属性以支持上下两行文本。- 增加
QMUICheckbox组件及其 Demo。 - 增加
QMUILayouter组件及其 Demo 以实现一种简便的 CSS Flexbox 布局模型。 QMUIModalPresentationViewController增加属性shouldBecomeKeyWindow,允许业务升起一个非 keyWindow 的浮层,避免影响已有界面的键盘显隐(例如 QMUIDemo 里的
QMUIDropdownNotification应用内顶部下拉通知条则关闭了该属性,从而避免当键盘正在显示时来了一个顶部通知,会把键盘强制降下去的问题)。QMUINavigationTitleView增加padding属性用于调整布局,增加adjustsSubviewsWhenHighlighted属性用于屏蔽默认的点击高亮表现。QMUIPopupContainerView增加preferLayoutAlignment、usesOppositeLayoutAlignmentIfNeeded属性用于控制浮层对准目标位置时,与目标位置的左右对齐方式。QMUIPopupContainerView增加setNeedsUpdateLayout方法代替原有的updateLayout,用于避免同一个 runloop 内重复刷新布局的问题。QMUIPopupContainerView增加showingAnimationBlock、hidingAnimationBlock属性以供业务自定义自己的显隐动画。QMUISearchController增加initWithContentsViewController: resultsViewController:方法、searchResultsController属性允许业务自定义搜索结果界面。QMUISearchController增加supportsSwipeToDismissSearch属性用于支持侧滑手势退出搜索。- 增加
QMUISheetPresentation组件用于支持类似微信内临时的半屏聊天界面、视频号评论区那种半屏浮层,可在显示半屏浮层的同时以普通 push 的方式打开下一级界面,这是区别于QMUIModalPresentationViewController的关键点。 QMUITextView增加属性isDeletingDuringTextChange用于在文本发生变化时判断当前是否正在删除。QMUIHelper增加isDynamicIslandDevice属性用于区分当前设备是否拥有灵动岛。QMUIHelper增加baselineOffsetWhenVerticalAlignCenterInHeight:withFont:方法,用于计算出能让指定字体在给定行高内垂直居中的 baselineOffset 值。NSAttributedString (QMUI)增加qmui_textAlignment属性用于便捷地获取/修改富文本里的文字对齐方式,增加qmui_applyParagraphStyle:方法用于便捷地修改富文本里的段落样式。- 增加
NSRegularExpression (QMUI)分类,支持正则对象的缓存(因为正则对象的创建是个耗时操作),以优化高频使用正则表达式场景的性能。 UIImage (QMUI)增加属性qmui_name以获取图片在 ImageAsset 里的命名。UIScrollView (QMUI)增加方法qmui_scrollToRect:atPosition:animated:以方便地控制滚动位置。UISearchBar (QMUI)增加属性qmui_adjustTextFieldLayoutForIndexBar用于控制当UITableView显示右边的 A-Z 索引条时,搜索框内的输入框是否要自动调整布局以避免与索引条重叠的特性。UISearchController (QMUI)增加属性qmui_alwaysShowSearchResultsController用于实现即便搜索框文本为空依然可以一直显示搜索结果界面的功能(系统默认是搜索文本不为空才显示)。UITableViewCell (QMUI).qmui_accessoryView现在支持获取到系统的排序按钮等控件。UITextView (QMUI)增加qmui_updateContentSize方法以刷新内容尺寸。UIWindow (QMUI)增加qmui_canBecomeKeyWindow、qmui_canResignKeyWindowBlock用于控制 window 的 key 状态。
会带来 QMUI 新旧版本兼容问题的更新
QMUIAlertController的成员变量_maskView重命名为_dimmingView,属性shouldRespondMaskViewTouch重命名为shouldRespondDimmingViewTouch。QMUIToastView的属性maskView重命名为dimmingView。QMUIBadgeProtocol里的qmui_badgeLabel重命名为qmui_badgeView,且类型从QMUILabel改为更通用的UIView,也即支持自定义 View 作为角标。- 重构
QMUIPopupMenuView组件,内部改为UITableView的实现,以满足大数据量场景下的性能要求,同时内置单选、多选模式及对应的 UI 表现,具体请查看 QMUI Demo 的新示例。 - [NSArray qmui_mapWithBlock:]方法增加 index 参数。- 删除
- [UIActivityIndicatorView initWithActivityIndicatorStyle: size:]方法,改为通过 hook 来实现以普通setFrame:方式调整其尺寸。 - 配置表
NavBarTitleColor的生效范围从QMUINavigationTitleView类型的titleView扩大为UIView.qmui_useAsNavigationTitleView == YES。 - 配置表删除废弃的
badgeCenterOffset、badgeCenterOffsetLandscape、updatesIndicatorCenterOffset、updatesIndicatorCenterOffsetLandscape。
如何适配新版
- 若项目内有继承自
QMUIAlertController的子类,请检查是否有用到成员变量_maskView,若有,则重命名为_dimmingView。 - 全局搜索“shouldRespondMaskViewTouch”,将其改为“shouldRespondDimmingViewTouch”。
- 全局搜索用到
QMUIToastView.maskView的地方,将其改为dimmingView。 - 全局搜索“qmui_badgeLabel”,将其改为“qmui_badgeView”。
- 由于
QMUIPopupMenuView整个重写,带来大量的类型、接口变更,在此无法一一列出适配方式,所以请直接参考 QMUI Demo 的写法,自行修改,遇到不清楚的可提 Issue。 - 全局搜索“qmui_mapWithBlock”将用到的地方改为新的带 index 参数的 block。
- 全局搜索用到
- [UIActivityIndicatorView initWithActivityIndicatorStyle: size:]的地方,将其改为普通的 init。 - 若有使用配置表,请观察界面的顶部
titleView颜色是否保持与更新前一致。 - 若有使用配置表,请不区分大小写地搜索“badgeCenterOffset”、“badgeCenterOffsetLandscape”、“updatesIndicatorCenterOffset”、“updatesIndicatorCenterOffsetLandscape”,将用到的地方改为
badgeOffset、badgeOffsetLandscape、updatesIndicatorOffset、updatesIndicatorOffsetLandscape。
Bugfix
- #1542 修复特殊字符可能引发的 substring crash。
- #1557 修复因与系统
UIView.maskView属性重名,导致 Xcode 16、iOS 18 运行 QMUI 可能命中系统断言的 bug。 - 修复
QMUIKeyboardManager获取键盘所在 view、window 方法的 bug。 - 修复
QMUITextField.maximumTextLength当光标在文本中间时,触发长度限制裁剪文本,会把文本末尾的文字裁剪(预期应该是光标前面的文本)的 bug。 - 修复
flat系列函数因浮点精度问题导致无法计算出最接近的像素整数值的 bug。 - 优化
QMUIHelper.deviceModel方法的实现方式,避免频繁获取值,以满足隐私合规的要求。 - 修复
QMUIHelper.navigationBarMaxYConstant在灵动岛设备上返回值错误的 bug。 - 修复
QMUIStringPrivate里提供的若干 substring 的方法在某些场景无法正确返回NSAttributedString类型的 bug。 - 修复设置了
UILabel (QMUI).qmui_lineHeight属性后文字无法正确垂直居中的 bug。 - 修复
UINavigationController (QMUI).qmui_rootViewController属性在某些极端场景下可能得到错误返回值的 bug。 - 修复
UIViewController (QMUI).qmui_previousViewController属性在某些极端场景下可能得到错误返回值的 bug。 - 修复
UIScrollView (QMUI).qmui_alreadyAtBottom可能因浮点精度问题导致返回值错误的 bug。 - 修复
UISlider (QMUI)可能获取 step 位置错误的 bug。 - 修复
UITabBarItem (QMUI).qmui_doubleTapBlock在UITabBarItem.title变化时无效的 bug。 - 修复
UITabBarItem (QMUI).qmui_doubleTapBlock在 iOS 18 下无效的 bug。 - 修复设置过
qmui_separatorInsetsBlock再置为 nil 后可能出现的 crash。