综述
该版本主要包含内网积累的若干更新,以及对 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。