Releases: Tencent/QMUI_iOS
Releases · Tencent/QMUI_iOS
4.8.0
综述
该版本主要包含内网积累的若干更新,以及对 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。
4.7.0
综述
随着 QMUI 最初的几位老人家各奔天涯,历经7年自费集资的老官网 qmuiteam.com在不久的将来费用消耗完就不再维护了,以后都在 GitHub。对应地,依附于官网的自动上报统计 SendAnalyticsToQMUITeam 也在这个版本删除,借此也跟大家分享下统计数据(毕竟在座的各位都参与其中)。
截止至2023-7-24,QMUI iOS 累计接入6w项目(以Bundle Id为维度),日活跃项目 1.6k+,月活跃项目 4.3k+。
这个版本主要是累积这段时间的修修补补。
新增功能
- 令
qmui_outsideEdge对UIBarButtonItem.customView也生效,以后你可以让导航栏按钮的响应区域扩大到导航栏之外了。 CALayer(QMUI)增加属性qmui_maskPathBlock用于快捷添加遮罩。CALayer(QMUI)增加属性qmui_evenOddMaskPathBlock用于快捷镂空一个区域。NSArray(QMUI)增加方法qmui_compactMapWithBlock:用于转换数组里的元素类型,并支持过滤掉nil。- 增加
NSDictionary(QMUI)分类,提供qmui_mapWithBlock:方法用于转换字典里的 key-value 类型,提供qmui_deepMapWithBlock:方法用于深度拷贝的转换。 - 新增 hook 用于保护
-[NSMutableAttributedString appendAttributedString:]遇到参数为nil时会命中系统 assert: nil argument 的情况。 UILabel(QMUI)增加qmui_centerOfCapHeight属性用于获取单行文本里font.capHeight的位置。UINavigationController(QMUI)增加属性qmui_alwaysInvokeAppearanceMethods用于在UINavigationController不可视时进行 push/pop 依然能触发 vc 生命周期方法的方法。UINavigationController(QMUI)增加属性qmui_lastOperation用于获取当前正在进行的切换界面动画类型(push 或 pop)。UITextField(QMUI)增加属性qmui_respondsToDeleteActionAtLeading用于对齐UITextView的行为:在输入框开头继续按删除按钮也可以触发 shoudChange 的 delegate 方法。
会带来 QMUI 新旧版本兼容问题的更新
- 配置表删除
SendAnalyticsToQMUITeam。
如何适配新版
- 如果你有使用配置表,请删除其中的
SendAnalyticsToQMUITeam。
Bugfix
- #1451 对因为被 present 盖住的界面,修改 navigationBar 样式时的 assert 条件做优化。
- 修复 #1473
UISearchController.searchBar作为UITableView.tableHeaderView时,进入搜索状态,搜索结果列表顶部有一大片空白的问题。 - 修复 #1498 开启
forceEnableInteractivePopGestureRecognizer的界面被 push 的过程中快速手势返回,容易导致 App 卡死的 bug。 - #1501 修复
AutomaticCustomNavigationBarTransitionStyle在setViewControllers:场景下的若干问题。 - 修复
QMUIImagePickerViewController初始滚动位置可能错误的 bug。 - 修复
QMUIAlertController以ActionSheet演示呈现较长内容时,顶部布局没考虑safeAreaInsets的问题。 - 修复
QMUIBadge对纯文本的UIBarButtonItem基准布局错误的 bug。 - 修复
QMUIButton在adjustsButtonWhenDisabled = NO时也会在setEnabled:YES里重置alpha的问题。 - 优化
QMUINavigationButton自定义返回按钮点击区域太小的问题。 - 修复
QMUIKeyboardManager在以 iPad“侧拉”模式打开的 App 中获取键盘可视高度错误的 bug,iPhone、iPad 全屏/分屏/台前调度,都没这个问题。 - 修复
QMUITheme在切换 theme 时错误地覆盖UITextView.textColor导致如果输入框内存在不同颜色的富文本时会颜色错误的 bug。 - 修复同一个对象对不同 window 分别调用
qmui_addSizeObserverForWindow:,最终其中某个 window size 发生变化时所有 block 都被触发的 bug。 - 解决在未使用配置表的情况下,QMUIAssert 应使自动变成 NSAssert 的问题。
- 修复 QMUI Demo 无法使用 XCTest 的问题。
- 修复
UISearchBar(QMUI)快速在 show/hide left/right accessoryView 时容易出现状态错误的 bug。 - 修复
UIView(QMUI).qmui_shouldShowDebugColor属性在开启又关闭后可能导致元素背景全黑的问题。
4.6.3
4.6.1 - 兼容 iOS 13-16
综述
QMUI 4.6.1 版本主要是在 4.6.0 的基础上把最低 iOS 支持版本从 11 提升到 13,以对齐微信。也正因此,很多仅对 iOS 11、12 写的代码也一并去除了(包括很多 hook),所以建议大部分项目都升级到 QMUI 4.6.1 以使用更精简的代码。
仍需支持 iOS 11、12 系统的项目,请使用 QMUI 4.6.0 。
会带来 QMUI 新旧版本兼容问题的更新
- 删除常量
QMUITableViewStyleInsetGrouped。 - 删除
UITableView (QMUI)的qmui_style属性。 - 删除宏
QMUIStatusBarStyleDarkContent。 - 删除
QMUIHelper.statusBarStyleDarkContent方法。 - 删除
UISearchBar (QMUI)的qmui_textField属性。 - 删除配置表里的
ShouldFixTabBarTransitionBugInIPhoneX开关。
如何适配新版
- 全局搜索
QMUITableViewStyleInsetGrouped,将其替换为系统的UITableViewStyleInsetGrouped。 - 全局搜索使用到
UITableView.qmui_style的地方(包括 Xib 文件),将其替换为系统的UITableView.style属性。 - 全局搜索
QMUIStatusBarStyleDarkContent,将其替换为系统的UIStatusBarStyleDarkContent。 - 全局搜索用到
QMUIHelper.statusBarStyleDarkContent的地方,将其替换为系统的UIStatusBarStyleDarkContent。 - 全局搜索用到
UISearchBar.qmui_textField的地方,将其改为系统的UISearchBar.searchTextField。 - 如果有使用配置表,请删除你配置表里的
ShouldFixTabBarTransitionBugInIPhoneX。
4.6.0 - 兼容 iOS 11-16
综述
QMUI 4.6.0 版本主要内容是兼容 iOS 16 及 iPhone 14 等新设备,以屏幕旋转、键盘管理为主。其中屏幕旋转的使用方式可以查看 Wiki:《适用于 iOS 16 及以下版本的屏幕方向控制方式》。
新增功能
QMUIPopupMenuView增加sectionSpacing属性用于控制section之间的间隙。QMUIThemeColor、QMUIThemeImage、QMUIThemeVisualEffect均增加了name属性及对应的 init 方法,让业务可以用字符串来标记该动态对象。- 增加
NSShadow (QMU)分类提供一个便捷的 init 方法。 CALayer (QMUI)增加属性qmui_shadow支持用NSShadow对象来描述投影样式,从而可以一行代码完成投影的设置。NSArray (QMUI)增加方法qmui_firstMatchWithBlock:用于过滤第一个符合 block 条件的元素。UIBezierPath (QMUI)增加方法qmui_bezierPathWithMediaTimingFunction:支持将一个CAMediaTimingFunction转成一条宽高为 1 的贝塞尔曲线(可以理解为数据可视化)。QMUICommonDefines.h增加IOS16_SDK_ALLOWED宏用来标志当前是否为 Xcode 14 编译环境。- 增加
[QMUIHelper screenSizeFor67InchAndiPhone14Later]方法、[QMUIHelper is67InchScreenAndiPhone14Later]方法、IS_67INCH_SCREEN_AND_IPHONE14宏用于标记当前设备是否为 iPhone 14 Pro Max 尺寸的屏幕。 - 增加
[QMUIHelper statusBarHeightConstant]用于获取静态的状态栏高度。 -[QMUIHelper deviceName]、-[QMUIHelper deviceModel]增加新设备的信息。-[QMUIHelper safeAreaInsetsForDeviceWithNotch]增加新设备的值。UIViewController (QMUI_Interface)增加方法qmui_rotateToInterfaceOrientation:用于强制将当前界面旋转到某个指定方向。UIViewController (QMUI_Interface)增加方法qmui_setNeedsUpdateOfSupportedInterfaceOrientations对应 iOS 16 系统的setNeedsUpdateOfSupportedInterfaceOrientations,用于告诉系统当前希望刷新屏幕方向。UITableViewCell (QMUI)增加属性qmui_configureReorderingStyleBlock支持修改 cell 在排序过程中的样式。
会带来 QMUI 新旧版本兼容问题的更新
QMUIPopupContainerView将UIColor *shadowColor属性改为NSShadow *shadow以支持更完整的投影样式。UISlider (QMUI)将qmui_thumbShadowColor、qmui_thumbShadowOffset、qmui_thumbShadowRadius删除,改为新增的qmui_thumbShadow属性。- 使
StatusBarHeightConstant能兼容 iOS 16、iPhone 14 Pro 灵动岛。 - 将 iPhone 14 Pro Max 加入到
AS_65INCH_SCREEN宏内。 - 将 iPhone 14 Pro Max 加入到
-[QMUIHelper isRegularScreen]内。 - 删除
+[QMUIHelper rotateToDeviceOrientation:]方法。
如何适配新版
- 全局搜索使用到
QMUIPopupContainerView.shadowColor的地方,将其改为新的shadow属性。 - 全局搜索使用到
UISlider.qmui_thumbShadowColor、UISlider.qmui_thumbShadowOffset、UISlider.qmui_thumbShadowRadius的地方,将其替换为新的qmui_thumbShadow属性。 - 全局搜索用到
StatusBarHeightConstant的地方,分别测试其在 iPhone 13 和 iPhone 14 Pro 下的布局是否正确。 - 全局搜素用到
AS_65INCH_SCREEN的地方,测试其在 iPhone 14 Pro Max 下的布局是否正确。 - 全局搜索用到
-[QMUIHelper isRegularScreen]的地方,测试其在 iPhone 14 Pro Max 下表现是否正确。 - 全局搜索使用到
+[QMUIHelper rotateToDeviceOrientation:]的地方,将其换成-[UIViewController qmui_rotateToInterfaceOrientation:]。
Bugfix
- #1437 修复在 iOS 15 里打开一个默认隐藏导航栏的界面,返回按钮样式错误的 bug。
- #1438 修复
QMUIPopupContainerView将sourceView设置为nil时 crash 的 bug。 - #1439
UIView.qmui_hitTestBlock的返回值应该添加_Nullable以对齐系统。 - #1447 #1450 #1453 #1458 #1460 解决 iOS 16 下
QMUIKeyboardManager的各种 bug。 - #1449 #1463 修复将
UIView.backgroundColor设置为QMUIThemeColor后再设置为另一个与QMUIThemeColor当前色值相同的颜色时,后者无效的 bug。 - #1451 修复在尚未添加到 window 的
UINavigationController里修改navigationBar可能会导致navigationBar样式错误的 bug。 - #1452 修复开启系统辅助功能粗体文本的情况下,设置了
tintColorAdjustsTitleAndImage的QMUIButton在 App 切到桌面再切回来时颜色错误的 bug。 - #1457 修复 Xcode 14 编译的 App 在 iOS 16.0 上可能存在顶部标题布局错乱的 bug。
- 修复
QMUINavigationTitleView.subAccessoryView在计算布局时如果subAccessoryView带有transform则布局错误的 bug。 - 修复
QMUIPopupContainerView在sourceView、sourceBarItem的值更新时没有清除与旧值的绑定关系的 bug。 - 修复
QMUIPopupContainerView计算宽高可能不准确的 bug:应该取 px 整数而不是 pt 整数。 - 修复
QMUIPopupMenuButtonItem里强制修改button.contentEdgeInsets.top/bottom为 0 的 bug。 - 修复 iOS 16 里
QMUITextView文本颜色设置为QMUIThemeColor后无法响应 theme 变化的 bug。 - 修复
-[QMUIHelper keyboardHeightWithNotification:inView:]在 iOS 16 台前调度下无法返回正确值的 bug。 - 修复
UITableViewCell(QMUI).qmui_selectedBackgroundColor有时候失效的 bug。
其他
- #1378 支持 Mac Catalyst 编译。
- 由于 iOS 16 对横竖屏体验的优化,所以配置表里的
AutomaticallyRotateDeviceOrientation在 iOS 16 下已经不需要了,请业务项目知悉即可。
4.5.1
会带来 QMUI 新旧版本兼容问题的更新
NSObject (QMUI).qmui_ivarList输出的内容里,为每个 Ivar 开头增加了 offset 值的展示,同时显示十进制和十六进制的值,中间用“|”隔开。
如何适配新版
- 全局搜索“qmui_ivarList”,检查使用到的地方是否有影响。
Bugfix
- #1432 修复开启
AutomaticCustomNavigationBarTransitionStyle的情况下,从界面 B pop 回界面 A 的过程,如果 A 的导航栏效果与全局默认效果不同,则在 pop 过程中 A 的导航栏样式错误的 bug。 - #1434 修复
qmui_outsideEdge在不可见的 view 上生效的 bug。 - 修复
QMUIAlertController在 alert、actionSheet 两种 style 下,如果不存在 title、message、customView 时,第一个 action 的顶部依然错误出现分隔线的 bug。 - 修复
UIScrollView (QMUI).qmui_alreadyAtTop可能因为浮点精度问题导致返回值错误的 bug。
4.5.0
新增功能
- 增加
QMUIBarProtocol用于同时约定UINavigationBar、UITabBar的功能接口,因为这两种 bar 所需要的功能基本都一样,用 protocol 来约定也便于后续同步调整这两种 bar 的功能。同时也因此使得UINavigationBar (QMUI)新增了qmui_effectView、qmui_effectViews、qmui_effect、qmui_effectForegroundColor几个与磨砂相关的接口。 - 由于
QMUIBarProtocol为UINavigationBar带来更多的能力,所以这个版本我们优化了QMUISmoothEffect、AutomaticCustomNavigationBarTransitionStyle里与磨砂相关的表现,使其更符合组件预期。 - 增加
UIView (QMUINavigationTitleView).qmui_useAsNavigationTitleView属性用于标记某个 view 为自定义的导航栏 titleView,以便 QMUI 自动帮你处理一些布局上的系统 bug。 QMUIPopupMenuView增加willHandleButtonItemEventBlock属性便于统一管理 item 的点击行为。CALayer (QMUI)增加qmui_layerWithName:方法用于便捷查找指定 name 的 layer。UIActivityIndicator(QMUI)支持用qmui_size指定大小。
会带来 QMUI 新旧版本兼容问题的更新
- 由于
QMUIBarProtocol的调整,我们同时删除了UINavigationBar (QMUI).qmui_backgroundContentView属性。 UISearchController.dimsBackgroundDuringPresentation默认值在 iOS 15 下被改为 NO 了,为了保持与旧版本的一致,QMUISearchController里将其改为 YES。- #1425
QMUICommonTableViewController内自带的QMUISearchController的搜索结果列表的UITableViewStyle从 Plain 改为与当前宿主 vc 的 tableView.style 一致。 - 将 QMUIStringPrivate
qmui_substringFromIndex的参数 index 等于字符串长度时返回的值从 nil 改为 @"",以保持与系统方法一致。
如何适配新版
- 如果仍需要
UINavigationBar (QMUI).qmui_backgroundContentView属性,请将 QMUIKit 旧代码抄到业务项目里。 - 检查 iOS 15 里用到
QMUISearchController的地方,检查进入搜索状态时界面表现是否符合预期。 - 简单检查用到
QMUICommonTableViewController、带有搜索功能,且 style 不为UITableViewStylePlain的列表,其搜索结果的 tableViewStyle 是否符合预期。 - 请检查用到
qmui_substringFromIndex的地方,在 index 等于 string.length 时表现是否正常。
Bugfix
- 修复
QMUIAlertController以 alert 形式显示时,如果内容特别多,浮层会溢出到屏幕的 safeAreaInsets 区域的问题。 - 修复
QMUIConsole.canShow = NO时依然会创建相关的 view、viewController 对象的问题。 - 修复 iOS 15.4 启动 App 后到系统设置-辅助功能-显示与文字大小-修改一下“按钮形状”的开关,会 crash:
-[UILabel _accessibilityButtonShapesChangedNotification:]: message sent to deallocated instance 0x17e751d60的问题。 - 修复
QMUIMultipleDelegates在 iOS 16 下配合UIScrollView可能引发 crash 的问题。 - 修复
QMUINavigationTitleView.needsLoadingPlaceholderSpace = NO时即便不显示 loading,loading 也会占位,导致文字偏右的问题。 - 修复
QMUITextView文字换行时丢失系统滚动动画特效的 bug。 - 修复
- [QMUITextView setFrame:]被调用时即便 size 没变化也会触发setContentOffset:产生滚动的问题。 - 修复配置表的值发生变化时重新应用的时候,对于业务 App 使用自定义 container viewController 的场景,无法正确刷新它的 navigationBar、tabBar 样式的 bug。
- 修复
+[QMUIHelper applicationSize]在 MacCatalyst App / M1 上返回了CGSizeZero导致APPLICATION_WIDTH、APPLICATION_HEIGHT的值为 0 的 bug。 - 修复在 root controller 实现了
preferredStatusBarStyle方法并且在其中调用childViewControllerForStatusBarStyle方法的情况下,iOS 12 present 起AVPlayerViewController在 dismiss 时会触发preferredStatusBarStyle导致死循环的 bug:因为AVPlayerViewController内部的preferredStatusBarStyle会转向presentingViewController的preferredStatusBarStyle,而后者又会return AVPlayerViewController,于是死循环。 - 修复
qmui_substringAvoidBreakingUpCharacterSequences系列方法在遇到 length 为1、range 与 string 相等的情况时会 crash 的 bug。 - 修复
QMUIStringPrivate里的 assert 条件与系统方法不匹配的问题。 - 修复
substring:avoidBreakingUpCharacterSequencesWithRange:lessValue:countingNonASCIICharacterAsTwo:在接受的 range 头尾都刚好落在一个 emoji 的中间时会得到一个负值 range 并引起 crash 的 bug,同时对负值 range 做 QMUIAssert 的提醒但不干预其返回值。 - #1248 #1274 #1377 修复
QMUIConsole在没使用配置表或者配置表里没设置TableViewCellBackgroundColor的情况下,打印出来的日志背景是白色的,看不见文字的 bug。 - #1326 调整
StatusBarHeightConstant的值,使其在 statusBarHidden 时,iOS 14 下返回44,iOS 15 返回50,保持与系统UIApplication.statusBarFrame.size.height一致。 - #1391 修复
NSURL (QMUI).qmui_queryItemsitem 类型错误的 bug。 - #1404 修复
QMUITextView当文本较多,在真机上长按系统输入法的删除按钮达到快速删除模式时,输入框底部容易出现大段空白的 bug。 - #1411 修复
UITableView.delegate开启了qmui_multipleDelegatesEnabled后在 dealloc 时可能引发 crash 的问题。 - #1413 修复
UISlider(QMUI)先设置qmui_step再设置qmui_stepDidChangeBlock后某些情况下首次点击无法触发 block 的 bug。 - #1418 修复
UIImageView、UIButton配合 template image 使用时无法通过tintColor来修改图片颜色的 bug。 - #1415 修复
QMUINavigationTitleView先设置needsLoadingView = YES再修改loadingViewSize会导致文字无法完整显示的 bug。 - #1421 修复
QMUILabel.truncatingTailView在 label.text 为空时 crash 的 bug。 - #1427 修复 QMUI 里
UITableView先setDelegate:再setDataSource:可能引发 crash 的问题。
其他
- 将
QMUIConsole专属的 window 类型从UIWindow改为QMUIConsoleWindow,使其更容易与其他 window 区分开(例如在 Lookin 里查看结构时)。 - [NSString (QMUI) qmui_trim]默认去掉 C 里的字符串结束符“\0”。
4.4.3
UISlider (QMUI)增加qmui_stepDidChangeBlock以更便捷的方式监听 step 的变化,同时修复之前用 value changed 监听可能不准确的 bug。- 优化 UIImage (QMUI) 里与 QMUITheme 相关的一些报错的判断方式,之前的写法会导致“对一个 QMUIThemeImage 调用 qmui_imageWithTintColor: 会误判”的问题。
- 优化 QMUIStringPrivate 里对 substrings 系列方法的报错,将其从 NSAssert 改为 QMUIAssert,这样业务如果不太关注的话,可以以 log 的形式输出,而不会中断 Debug。
- 优化
-[NSString (QMUI) qmui_capitalizedString的实现,如果字符串以 Emoji 开头,就不应该尝试转为大写了。 - #1358 修复
UITabBar (QMUI).qmui_effectViews在 iOS 12 及以下会 crash 的 bug。
4.4.2
新增功能
QMUIStringPrivate增加对NSStringsubstring 系列接口的异常情况的保护,方便自动发现类似裁剪字符串时不小心把 emoji 从中间裁剪的场景,避免出现乱码、crash。NSObject (QMUI)增加qmui_viewInfo属性用于 Debug 时方便地输出某个 view 的 view 层级结构。
会带来 QMUI 新旧版本兼容问题的更新
- 为了修复 #1351 的 bug,我们修改了
QMUINavigationBarScrollingAnimator自动获取UINavigationBar的逻辑,旧版本是通过QMUIHelper.visibleViewController.navigationController.navigationBar来获取,新版本改为通过绑定的 scrollView 一层一层往上找,找到所在的 viewController 的导航栏。所以如果业务项目以前存在“scrollView 所在的 viewController,和 scrollView 控制的 navigationBar 不处于同一个 UINavigationController” 里时,则更新 QMUI 版本后 animator 会失效。大部分情况下业务项目应该不会存在这种场景。
如何适配新版
- 检查业务项目里使用了
QMUINavigationBarScrollingAnimator、QMUINavigationBarScrollingSnapAnimator的地方,效果是否与 4.4.1 一致。
Bugfix
- #1330 #1346 修复
NavBarRemoveBackgroundEffectAutomatically在开启了AutomaticCustomNavigationBarTransitionStyle时可能对假 bar 无效的 bug。 - #1351 修复
QMUINavigationBarScrollingAnimator在 scrollView 所在的 viewController 已经被推出UINavigationController时,滚动器依然能对 UINavigationBar 产生影响的 bug。 - #1352 修复
QMUIButton开启了adjustsImageTintColorAutomatically后修改 normal 的 image,highlighted、disabled 的 image 无法同步更新的 bug。 - 修复
QMUIModalPresentationAnimationStylePopup的 hide 动画无法看到缩小过程的 bug。
QMUI Demo
- 修复
QMUISmoothEffect在转场过程中修改 effect 可能出现的 crash。
4.4.1
新增功能
- 新增
UILabel (QMUI_Marquee)分类,支持开启系统UILabel内置的跑马灯效果,功能比QMUIMarqueeLabel简单,但由于是系统内置的能力,性能应该是不需要担心的。我们推荐在满足需求的前提下优先使用UILabel (QMUI_Marquee)。 - 新增
UISlider (QMUI)分类用于取代之前的QMUISlider(后者已删除),提供同等功能的同时,增加了qmui_numberOfSteps用于支持离散式数据,同时让UIView (QMUI).qmui_outsideEdge作用在UISlider上时,可以扩大中间圆点的响应区域(以前是扩大整个 slider,这通常不符合预期)。UISlider+QMUI.mov
QMUITextFieldDelegate增加方法textField:shouldChangeCharactersInRange:replacementString:originalValue:,用于业务使用了maximumTextLength时可以通过这个方法来实现业务自定义的输入限制。在之前的版本里,自定义的输入限制和maximumTextLength是两个互斥的能力。- 同上,
QMUITextViewDelegate也增加了方法textView:shouldChangeTextInRange:text:originalValue:,原因不再赘述。 UIImage (QMUI)里的qmui_imageWithTintColor:、qmui_imageWithColor:方法增加 QMUIAssert 用于辅助发现业务里“无法正确用一个 QMUIThemeColor 生成一张 QMUIThemeImage” 的场景。UITabBar (QMUI)增加qmui_effectViews用于在 iOS 15 里获取所有的背景磨砂 view。
会带来 QMUI 新旧版本兼容问题的更新
- 由于
QMUISlider提供的功能没必要非要以子类的形式存在,因此这个版本我们删除了QMUISlider,同时新增了功能更加强大的UISlider (QMUI)分类。 - 上个版本里,为了修复 #1320 的问题,引入了 #1320 (comment) 所述的新问题,经过考虑,这个版本我们回退了 4.4.0 里的改动(也即与 4.3.0 一致),至于 #1320 的问题,是 OC 和 Swift 语言特性导致的,QMUI 暂时不处理,业务请自行规避该用法。
如何适配新版
- 如果你的 App 是用 Xcode 13 打包的,请检查运行在 iOS 15 上时 QMUITheme 功能是否正常。
- 如果你的项目里有使用
QMUISlider,请将其改为UISlider (QMUI)里的对应属性(通常都是加个qmui_前缀而已),或者也可以直接复制 QMUISlider.h/.m 到项目内继续使用。 - 请检查项目里继承自
QMUITableViewCell并且重写了initWithStyle:reuseIdentifier:方法,但在业务使用时通过initForTableView:withStyle:reuseIdentifier:构造 cell 的场景,表现是否正常(预期应该与 4.3.0 保持一致)。 - 更新项目内的 QMUI 版本,运行起来后,请检查 Xcode 控制台是否输出“QMUIThemeColor 生成的图片却不是 QMUIThemeImage”字样的 log,如果有,意味着该处的 image 可能无法自动响应 theme 变化。
如果有使用配置表
- 请将配置表里
QMUILog段落的位置迁移到UIControl的前面,这样才能保证其他模块在用到与 QMUILog 相关的开关时能读取到正确的值。
Bugfix
- #1236 由于新增的
UISlider (QMUI)分类,顺便修复了 iOS 14 及以后的系统里无法正确获取到 thumbView 的 bug。 - #1247 修复 iOS 14 及以后的系统里,如果项目对一个
UIView使用了qmui_layoutSubviewsBlock属性,则会导致在 iPad 里开启悬浮键盘时,聚焦一个带有inputAccessoryView的输入框时会死循环卡死的 bug。 - 修复开启了
NavBarRemoveBackgroundEffectAutomatically后 iOS 15 里的barTintColor无法与effectView共存的 bug。 - #1335 修复
AutomaticCustomNavigationBarTransitionStyle在前后两个导航栏的显隐状态不一致时表现错误的 bug。 - 修复 Xcode 13 编译的 App 在 iOS 15 下运行时,如果某个界面通过
QMUINavigationControllerAppearanceDelegate系列方法控制自己的导航栏样式,则停留在该界面时切换 QMUITheme,导航栏样式会被覆盖为配置表的全局样式,而非该界面自己设置的值。 - 修复
-[NSString(QMUI) qmui_substringAvoidBreakingUpCharacterSequencesToIndex:]方法在 index 刚好等于string.length时会 crash 的 bug:从语义上这样的 index 应当是合法的,此时需要返回当前 string 的 copy。 - 修复
UITabBar (QMUI).qmui_effectView在 iOS 15 下无法正确获取到背景磨砂 view 的 bug,会导致UITabBar (QMUI).qmui_effect失效。 - 修复
QMUITableViewStyleInsetGrouped的列表,每个 section 最后一个 cell 右下角的圆角丢失的 bug。
QMUI Demo
- 重新制作
UISlider (QMUI)的 Demo。 QMUIMarqueeLabelDemo 增加UILabel (QMUI_Marquee)功能的展示。- 优化
QMUIInteractiveDebugPanelViewController的使用方式,使其可以方便地以 subview 的形式添加到界面上显示,也可以配置自己项目的外观。 UIImage (QMUI)Demo 增加渐变图片的展示。UITextField (QMUI)Demo 增加对自定义内容格式限制的展示。