Skip to content

Releases: Tencent/QMUI_iOS

4.8.0

21 Sep 22:11
Compare
Choose a tag to compare

综述

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

4.7.0

24 Jul 14:22
Compare
Choose a tag to compare

综述

随着 QMUI 最初的几位老人家各奔天涯,历经7年自费集资的老官网 qmuiteam.com在不久的将来费用消耗完就不再维护了,以后都在 GitHub。对应地,依附于官网的自动上报统计 SendAnalyticsToQMUITeam 也在这个版本删除,借此也跟大家分享下统计数据(毕竟在座的各位都参与其中)。

截止至2023-7-24,QMUI iOS 累计接入6w项目(以Bundle Id为维度),日活跃项目 1.6k+,月活跃项目 4.3k+。


这个版本主要是累积这段时间的修修补补。

新增功能

  1. qmui_outsideEdgeUIBarButtonItem.customView 也生效,以后你可以让导航栏按钮的响应区域扩大到导航栏之外了。
  2. CALayer(QMUI) 增加属性 qmui_maskPathBlock 用于快捷添加遮罩。
  3. CALayer(QMUI) 增加属性 qmui_evenOddMaskPathBlock 用于快捷镂空一个区域。
  4. NSArray(QMUI) 增加方法 qmui_compactMapWithBlock: 用于转换数组里的元素类型,并支持过滤掉 nil
  5. 增加 NSDictionary(QMUI) 分类,提供 qmui_mapWithBlock: 方法用于转换字典里的 key-value 类型,提供 qmui_deepMapWithBlock: 方法用于深度拷贝的转换。
  6. 新增 hook 用于保护 -[NSMutableAttributedString appendAttributedString:] 遇到参数为 nil 时会命中系统 assert: nil argument 的情况。
  7. UILabel(QMUI) 增加 qmui_centerOfCapHeight 属性用于获取单行文本里 font.capHeight 的位置。
  8. UINavigationController(QMUI) 增加属性 qmui_alwaysInvokeAppearanceMethods 用于在 UINavigationController 不可视时进行 push/pop 依然能触发 vc 生命周期方法的方法。
  9. UINavigationController(QMUI) 增加属性 qmui_lastOperation 用于获取当前正在进行的切换界面动画类型(push 或 pop)。
  10. UITextField(QMUI) 增加属性 qmui_respondsToDeleteActionAtLeading 用于对齐 UITextView 的行为:在输入框开头继续按删除按钮也可以触发 shoudChange 的 delegate 方法。

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

  1. 配置表删除 SendAnalyticsToQMUITeam

如何适配新版

  1. 如果你有使用配置表,请删除其中的 SendAnalyticsToQMUITeam

Bugfix

  1. #1451 对因为被 present 盖住的界面,修改 navigationBar 样式时的 assert 条件做优化。
  2. 修复 #1473 UISearchController.searchBar 作为 UITableView.tableHeaderView 时,进入搜索状态,搜索结果列表顶部有一大片空白的问题。
  3. 修复 #1498 开启 forceEnableInteractivePopGestureRecognizer 的界面被 push 的过程中快速手势返回,容易导致 App 卡死的 bug。
  4. #1501 修复 AutomaticCustomNavigationBarTransitionStylesetViewControllers: 场景下的若干问题。
  5. 修复 QMUIImagePickerViewController 初始滚动位置可能错误的 bug。
  6. 修复 QMUIAlertControllerActionSheet 演示呈现较长内容时,顶部布局没考虑 safeAreaInsets 的问题。
  7. 修复 QMUIBadge 对纯文本的 UIBarButtonItem 基准布局错误的 bug。
  8. 修复 QMUIButtonadjustsButtonWhenDisabled = NO 时也会在 setEnabled:YES 里重置 alpha 的问题。
  9. 优化 QMUINavigationButton 自定义返回按钮点击区域太小的问题。
  10. 修复 QMUIKeyboardManager 在以 iPad“侧拉”模式打开的 App 中获取键盘可视高度错误的 bug,iPhone、iPad 全屏/分屏/台前调度,都没这个问题。
  11. 修复QMUITheme 在切换 theme 时错误地覆盖 UITextView.textColor 导致如果输入框内存在不同颜色的富文本时会颜色错误的 bug。
  12. 修复同一个对象对不同 window 分别调用 qmui_addSizeObserverForWindow:,最终其中某个 window size 发生变化时所有 block 都被触发的 bug。
  13. 解决在未使用配置表的情况下,QMUIAssert 应使自动变成 NSAssert 的问题。
  14. 修复 QMUI Demo 无法使用 XCTest 的问题。
  15. 修复 UISearchBar(QMUI) 快速在 show/hide left/right accessoryView 时容易出现状态错误的 bug。
  16. 修复 UIView(QMUI).qmui_shouldShowDebugColor 属性在开启又关闭后可能导致元素背景全黑的问题。

4.6.3

15 Dec 07:11
Compare
Choose a tag to compare

🎆🎉🧨🧧 2022→2023

Bugfix

  1. 修复 QMUIThemeColor.CGColor 内存泄漏的 bug。
  2. 修复 QMUITextFieldQMUITextView 在某些情况下 shouldChangeCaractersInRange:replacementString:originalValue: 没被调用的 bug。
  3. 优化某些场景即便调用 qmui_rotateToInterfaceOrientation 依然无法触发屏幕方向旋转的问题。

4.6.1 - 兼容 iOS 13-16

07 Dec 19:45
Compare
Choose a tag to compare

综述

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 新旧版本兼容问题的更新

  1. 删除常量 QMUITableViewStyleInsetGrouped
  2. 删除 UITableView (QMUI)qmui_style 属性。
  3. 删除宏 QMUIStatusBarStyleDarkContent
  4. 删除 QMUIHelper.statusBarStyleDarkContent 方法。
  5. 删除 UISearchBar (QMUI)qmui_textField 属性。
  6. 删除配置表里的 ShouldFixTabBarTransitionBugInIPhoneX 开关。

如何适配新版

  1. 全局搜索 QMUITableViewStyleInsetGrouped,将其替换为系统的 UITableViewStyleInsetGrouped
  2. 全局搜索使用到 UITableView.qmui_style 的地方(包括 Xib 文件),将其替换为系统的 UITableView.style 属性。
  3. 全局搜索 QMUIStatusBarStyleDarkContent,将其替换为系统的 UIStatusBarStyleDarkContent
  4. 全局搜索用到 QMUIHelper.statusBarStyleDarkContent 的地方,将其替换为系统的 UIStatusBarStyleDarkContent
  5. 全局搜索用到 UISearchBar.qmui_textField 的地方,将其改为系统的 UISearchBar.searchTextField
  6. 如果有使用配置表,请删除你配置表里的 ShouldFixTabBarTransitionBugInIPhoneX

4.6.0 - 兼容 iOS 11-16

07 Dec 19:16
Compare
Choose a tag to compare

综述

QMUI 4.6.0 版本主要内容是兼容 iOS 16 及 iPhone 14 等新设备,以屏幕旋转、键盘管理为主。其中屏幕旋转的使用方式可以查看 Wiki:《适用于 iOS 16 及以下版本的屏幕方向控制方式》

新增功能

  1. QMUIPopupMenuView 增加 sectionSpacing 属性用于控制 section 之间的间隙。
  2. QMUIThemeColorQMUIThemeImageQMUIThemeVisualEffect 均增加了 name 属性及对应的 init 方法,让业务可以用字符串来标记该动态对象。
  3. 增加 NSShadow (QMU) 分类提供一个便捷的 init 方法。
  4. CALayer (QMUI) 增加属性 qmui_shadow 支持用 NSShadow 对象来描述投影样式,从而可以一行代码完成投影的设置。
  5. NSArray (QMUI) 增加方法 qmui_firstMatchWithBlock: 用于过滤第一个符合 block 条件的元素。
  6. UIBezierPath (QMUI) 增加方法 qmui_bezierPathWithMediaTimingFunction: 支持将一个 CAMediaTimingFunction 转成一条宽高为 1 的贝塞尔曲线(可以理解为数据可视化)。
  7. QMUICommonDefines.h 增加 IOS16_SDK_ALLOWED 宏用来标志当前是否为 Xcode 14 编译环境。
  8. 增加 [QMUIHelper screenSizeFor67InchAndiPhone14Later] 方法、[QMUIHelper is67InchScreenAndiPhone14Later] 方法、IS_67INCH_SCREEN_AND_IPHONE14 宏用于标记当前设备是否为 iPhone 14 Pro Max 尺寸的屏幕。
  9. 增加 [QMUIHelper statusBarHeightConstant] 用于获取静态的状态栏高度。
  10. -[QMUIHelper deviceName]-[QMUIHelper deviceModel] 增加新设备的信息。
  11. -[QMUIHelper safeAreaInsetsForDeviceWithNotch] 增加新设备的值。
  12. UIViewController (QMUI_Interface) 增加方法 qmui_rotateToInterfaceOrientation: 用于强制将当前界面旋转到某个指定方向。
  13. UIViewController (QMUI_Interface) 增加方法 qmui_setNeedsUpdateOfSupportedInterfaceOrientations 对应 iOS 16 系统的 setNeedsUpdateOfSupportedInterfaceOrientations,用于告诉系统当前希望刷新屏幕方向。
  14. UITableViewCell (QMUI) 增加属性 qmui_configureReorderingStyleBlock 支持修改 cell 在排序过程中的样式。

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

  1. QMUIPopupContainerViewUIColor *shadowColor 属性改为 NSShadow *shadow 以支持更完整的投影样式。
  2. UISlider (QMUI)qmui_thumbShadowColorqmui_thumbShadowOffsetqmui_thumbShadowRadius 删除,改为新增的 qmui_thumbShadow 属性。
  3. 使 StatusBarHeightConstant 能兼容 iOS 16、iPhone 14 Pro 灵动岛。
  4. 将 iPhone 14 Pro Max 加入到 AS_65INCH_SCREEN 宏内。
  5. 将 iPhone 14 Pro Max 加入到 -[QMUIHelper isRegularScreen] 内。
  6. 删除 +[QMUIHelper rotateToDeviceOrientation:] 方法。

如何适配新版

  1. 全局搜索使用到 QMUIPopupContainerView.shadowColor 的地方,将其改为新的 shadow 属性。
  2. 全局搜索使用到 UISlider.qmui_thumbShadowColorUISlider.qmui_thumbShadowOffsetUISlider.qmui_thumbShadowRadius 的地方,将其替换为新的 qmui_thumbShadow 属性。
  3. 全局搜索用到 StatusBarHeightConstant 的地方,分别测试其在 iPhone 13 和 iPhone 14 Pro 下的布局是否正确。
  4. 全局搜素用到 AS_65INCH_SCREEN 的地方,测试其在 iPhone 14 Pro Max 下的布局是否正确。
  5. 全局搜索用到 -[QMUIHelper isRegularScreen] 的地方,测试其在 iPhone 14 Pro Max 下表现是否正确。
  6. 全局搜索使用到 +[QMUIHelper rotateToDeviceOrientation:] 的地方,将其换成 -[UIViewController qmui_rotateToInterfaceOrientation:]

Bugfix

  1. #1437 修复在 iOS 15 里打开一个默认隐藏导航栏的界面,返回按钮样式错误的 bug。
  2. #1438 修复 QMUIPopupContainerViewsourceView 设置为 nil 时 crash 的 bug。
  3. #1439 UIView.qmui_hitTestBlock 的返回值应该添加 _Nullable 以对齐系统。
  4. #1447 #1450 #1453 #1458 #1460 解决 iOS 16 下 QMUIKeyboardManager 的各种 bug。
  5. #1449 #1463 修复将 UIView.backgroundColor 设置为 QMUIThemeColor 后再设置为另一个与 QMUIThemeColor 当前色值相同的颜色时,后者无效的 bug。
  6. #1451 修复在尚未添加到 window 的 UINavigationController 里修改 navigationBar 可能会导致 navigationBar 样式错误的 bug。
  7. #1452 修复开启系统辅助功能粗体文本的情况下,设置了 tintColorAdjustsTitleAndImageQMUIButton 在 App 切到桌面再切回来时颜色错误的 bug。
  8. #1457 修复 Xcode 14 编译的 App 在 iOS 16.0 上可能存在顶部标题布局错乱的 bug。
  9. 修复 QMUINavigationTitleView.subAccessoryView 在计算布局时如果 subAccessoryView 带有 transform 则布局错误的 bug。
  10. 修复 QMUIPopupContainerViewsourceViewsourceBarItem 的值更新时没有清除与旧值的绑定关系的 bug。
  11. 修复 QMUIPopupContainerView 计算宽高可能不准确的 bug:应该取 px 整数而不是 pt 整数。
  12. 修复 QMUIPopupMenuButtonItem 里强制修改 button.contentEdgeInsets.top/bottom 为 0 的 bug。
  13. 修复 iOS 16 里 QMUITextView 文本颜色设置为 QMUIThemeColor 后无法响应 theme 变化的 bug。
  14. 修复 -[QMUIHelper keyboardHeightWithNotification:inView:] 在 iOS 16 台前调度下无法返回正确值的 bug。
  15. 修复 UITableViewCell(QMUI).qmui_selectedBackgroundColor 有时候失效的 bug。

其他

  1. #1378 支持 Mac Catalyst 编译。
  2. 由于 iOS 16 对横竖屏体验的优化,所以配置表里的 AutomaticallyRotateDeviceOrientation 在 iOS 16 下已经不需要了,请业务项目知悉即可。

4.5.1

23 Aug 09:45
Compare
Choose a tag to compare

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

  1. NSObject (QMUI).qmui_ivarList 输出的内容里,为每个 Ivar 开头增加了 offset 值的展示,同时显示十进制和十六进制的值,中间用“|”隔开。

如何适配新版

  1. 全局搜索“qmui_ivarList”,检查使用到的地方是否有影响。

Bugfix

  1. #1432 修复开启 AutomaticCustomNavigationBarTransitionStyle 的情况下,从界面 B pop 回界面 A 的过程,如果 A 的导航栏效果与全局默认效果不同,则在 pop 过程中 A 的导航栏样式错误的 bug。
  2. #1434 修复 qmui_outsideEdge 在不可见的 view 上生效的 bug。
  3. 修复 QMUIAlertController 在 alert、actionSheet 两种 style 下,如果不存在 title、message、customView 时,第一个 action 的顶部依然错误出现分隔线的 bug。
  4. 修复 UIScrollView (QMUI).qmui_alreadyAtTop 可能因为浮点精度问题导致返回值错误的 bug。

4.5.0

10 Aug 16:59
Compare
Choose a tag to compare

新增功能

  1. 增加 QMUIBarProtocol 用于同时约定 UINavigationBarUITabBar 的功能接口,因为这两种 bar 所需要的功能基本都一样,用 protocol 来约定也便于后续同步调整这两种 bar 的功能。同时也因此使得 UINavigationBar (QMUI) 新增了 qmui_effectViewqmui_effectViewsqmui_effectqmui_effectForegroundColor 几个与磨砂相关的接口。
  2. 由于 QMUIBarProtocolUINavigationBar 带来更多的能力,所以这个版本我们优化了 QMUISmoothEffectAutomaticCustomNavigationBarTransitionStyle 里与磨砂相关的表现,使其更符合组件预期。
  3. 增加 UIView (QMUINavigationTitleView).qmui_useAsNavigationTitleView 属性用于标记某个 view 为自定义的导航栏 titleView,以便 QMUI 自动帮你处理一些布局上的系统 bug。
  4. QMUIPopupMenuView 增加 willHandleButtonItemEventBlock 属性便于统一管理 item 的点击行为。
  5. CALayer (QMUI) 增加 qmui_layerWithName: 方法用于便捷查找指定 name 的 layer。
  6. UIActivityIndicator(QMUI) 支持用 qmui_size 指定大小。

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

  1. 由于 QMUIBarProtocol 的调整,我们同时删除了 UINavigationBar (QMUI).qmui_backgroundContentView 属性。
  2. UISearchController.dimsBackgroundDuringPresentation 默认值在 iOS 15 下被改为 NO 了,为了保持与旧版本的一致,QMUISearchController 里将其改为 YES。
  3. #1425 QMUICommonTableViewController 内自带的 QMUISearchController 的搜索结果列表的 UITableViewStyle 从 Plain 改为与当前宿主 vc 的 tableView.style 一致。
  4. 将 QMUIStringPrivate qmui_substringFromIndex 的参数 index 等于字符串长度时返回的值从 nil 改为 @"",以保持与系统方法一致。

如何适配新版

  1. 如果仍需要 UINavigationBar (QMUI).qmui_backgroundContentView 属性,请将 QMUIKit 旧代码抄到业务项目里。
  2. 检查 iOS 15 里用到 QMUISearchController 的地方,检查进入搜索状态时界面表现是否符合预期。
  3. 简单检查用到 QMUICommonTableViewController、带有搜索功能,且 style 不为 UITableViewStylePlain 的列表,其搜索结果的 tableViewStyle 是否符合预期。
  4. 请检查用到 qmui_substringFromIndex 的地方,在 index 等于 string.length 时表现是否正常。

Bugfix

  1. 修复 QMUIAlertController 以 alert 形式显示时,如果内容特别多,浮层会溢出到屏幕的 safeAreaInsets 区域的问题。
  2. 修复 QMUIConsole.canShow = NO 时依然会创建相关的 view、viewController 对象的问题。
  3. 修复 iOS 15.4 启动 App 后到系统设置-辅助功能-显示与文字大小-修改一下“按钮形状”的开关,会 crash:-[UILabel _accessibilityButtonShapesChangedNotification:]: message sent to deallocated instance 0x17e751d60 的问题。
  4. 修复 QMUIMultipleDelegates 在 iOS 16 下配合 UIScrollView 可能引发 crash 的问题。
  5. 修复 QMUINavigationTitleView.needsLoadingPlaceholderSpace = NO 时即便不显示 loading,loading 也会占位,导致文字偏右的问题。
  6. 修复 QMUITextView 文字换行时丢失系统滚动动画特效的 bug。
  7. 修复 - [QMUITextView setFrame:] 被调用时即便 size 没变化也会触发 setContentOffset: 产生滚动的问题。
  8. 修复配置表的值发生变化时重新应用的时候,对于业务 App 使用自定义 container viewController 的场景,无法正确刷新它的 navigationBar、tabBar 样式的 bug。
  9. 修复 +[QMUIHelper applicationSize] 在 MacCatalyst App / M1 上返回了 CGSizeZero 导致 APPLICATION_WIDTHAPPLICATION_HEIGHT 的值为 0 的 bug。
  10. 修复在 root controller 实现了 preferredStatusBarStyle 方法并且在其中调用 childViewControllerForStatusBarStyle 方法的情况下,iOS 12 present 起 AVPlayerViewController 在 dismiss 时会触发 preferredStatusBarStyle 导致死循环的 bug:因为 AVPlayerViewController 内部的 preferredStatusBarStyle 会转向 presentingViewControllerpreferredStatusBarStyle,而后者又会 return AVPlayerViewController,于是死循环。
  11. 修复 qmui_substringAvoidBreakingUpCharacterSequences 系列方法在遇到 length 为1、range 与 string 相等的情况时会 crash 的 bug。
  12. 修复 QMUIStringPrivate 里的 assert 条件与系统方法不匹配的问题。
  13. 修复 substring:avoidBreakingUpCharacterSequencesWithRange:lessValue:countingNonASCIICharacterAsTwo: 在接受的 range 头尾都刚好落在一个 emoji 的中间时会得到一个负值 range 并引起 crash 的 bug,同时对负值 range 做 QMUIAssert 的提醒但不干预其返回值。
  14. #1248 #1274 #1377 修复 QMUIConsole 在没使用配置表或者配置表里没设置 TableViewCellBackgroundColor 的情况下,打印出来的日志背景是白色的,看不见文字的 bug。
  15. #1326 调整 StatusBarHeightConstant 的值,使其在 statusBarHidden 时,iOS 14 下返回44,iOS 15 返回50,保持与系统 UIApplication.statusBarFrame.size.height 一致。
  16. #1391 修复 NSURL (QMUI).qmui_queryItems item 类型错误的 bug。
  17. #1404 修复 QMUITextView 当文本较多,在真机上长按系统输入法的删除按钮达到快速删除模式时,输入框底部容易出现大段空白的 bug。
  18. #1411 修复 UITableView.delegate 开启了 qmui_multipleDelegatesEnabled 后在 dealloc 时可能引发 crash 的问题。
  19. #1413 修复 UISlider(QMUI) 先设置 qmui_step 再设置 qmui_stepDidChangeBlock 后某些情况下首次点击无法触发 block 的 bug。
  20. #1418 修复 UIImageViewUIButton 配合 template image 使用时无法通过 tintColor 来修改图片颜色的 bug。
  21. #1415 修复 QMUINavigationTitleView 先设置 needsLoadingView = YES 再修改 loadingViewSize 会导致文字无法完整显示的 bug。
  22. #1421 修复 QMUILabel.truncatingTailView 在 label.text 为空时 crash 的 bug。
  23. #1427 修复 QMUI 里 UITableViewsetDelegate:setDataSource: 可能引发 crash 的问题。

其他

  1. QMUIConsole 专属的 window 类型从 UIWindow 改为 QMUIConsoleWindow,使其更容易与其他 window 区分开(例如在 Lookin 里查看结构时)。
  2. - [NSString (QMUI) qmui_trim] 默认去掉 C 里的字符串结束符“\0”。

4.4.3

31 Dec 10:44
Compare
Choose a tag to compare
  1. UISlider (QMUI) 增加 qmui_stepDidChangeBlock 以更便捷的方式监听 step 的变化,同时修复之前用 value changed 监听可能不准确的 bug。
  2. 优化 UIImage (QMUI) 里与 QMUITheme 相关的一些报错的判断方式,之前的写法会导致“对一个 QMUIThemeImage 调用 qmui_imageWithTintColor: 会误判”的问题。
  3. 优化 QMUIStringPrivate 里对 substrings 系列方法的报错,将其从 NSAssert 改为 QMUIAssert,这样业务如果不太关注的话,可以以 log 的形式输出,而不会中断 Debug。
  4. 优化 -[NSString (QMUI) qmui_capitalizedString 的实现,如果字符串以 Emoji 开头,就不应该尝试转为大写了。
  5. #1358 修复 UITabBar (QMUI).qmui_effectViews 在 iOS 12 及以下会 crash 的 bug。

4.4.2

23 Dec 08:45
Compare
Choose a tag to compare

新增功能

  1. QMUIStringPrivate 增加对 NSString substring 系列接口的异常情况的保护,方便自动发现类似裁剪字符串时不小心把 emoji 从中间裁剪的场景,避免出现乱码、crash。
  2. NSObject (QMUI) 增加 qmui_viewInfo 属性用于 Debug 时方便地输出某个 view 的 view 层级结构。

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

  1. 为了修复 #1351 的 bug,我们修改了 QMUINavigationBarScrollingAnimator 自动获取 UINavigationBar 的逻辑,旧版本是通过 QMUIHelper.visibleViewController.navigationController.navigationBar 来获取,新版本改为通过绑定的 scrollView 一层一层往上找,找到所在的 viewController 的导航栏。所以如果业务项目以前存在“scrollView 所在的 viewController,和 scrollView 控制的 navigationBar 不处于同一个 UINavigationController” 里时,则更新 QMUI 版本后 animator 会失效。大部分情况下业务项目应该不会存在这种场景。

如何适配新版

  1. 检查业务项目里使用了 QMUINavigationBarScrollingAnimatorQMUINavigationBarScrollingSnapAnimator 的地方,效果是否与 4.4.1 一致。

Bugfix

  1. #1330 #1346 修复 NavBarRemoveBackgroundEffectAutomatically 在开启了 AutomaticCustomNavigationBarTransitionStyle 时可能对假 bar 无效的 bug。
  2. #1351 修复 QMUINavigationBarScrollingAnimator 在 scrollView 所在的 viewController 已经被推出 UINavigationController 时,滚动器依然能对 UINavigationBar 产生影响的 bug。
  3. #1352 修复 QMUIButton 开启了 adjustsImageTintColorAutomatically 后修改 normal 的 image,highlighted、disabled 的 image 无法同步更新的 bug。
  4. 修复 QMUIModalPresentationAnimationStylePopup 的 hide 动画无法看到缩小过程的 bug。

QMUI Demo

  1. 修复 QMUISmoothEffect 在转场过程中修改 effect 可能出现的 crash。

4.4.1

14 Dec 14:18
Compare
Choose a tag to compare

新增功能

  1. 新增 UILabel (QMUI_Marquee) 分类,支持开启系统 UILabel 内置的跑马灯效果,功能比 QMUIMarqueeLabel 简单,但由于是系统内置的能力,性能应该是不需要担心的。我们推荐在满足需求的前提下优先使用 UILabel (QMUI_Marquee)
  2. 新增 UISlider (QMUI) 分类用于取代之前的 QMUISlider(后者已删除),提供同等功能的同时,增加了 qmui_numberOfSteps 用于支持离散式数据,同时让 UIView (QMUI).qmui_outsideEdge 作用在 UISlider 上时,可以扩大中间圆点的响应区域(以前是扩大整个 slider,这通常不符合预期)。
    UISlider+QMUI.mov
  3. QMUITextFieldDelegate 增加方法 textField:shouldChangeCharactersInRange:replacementString:originalValue:,用于业务使用了 maximumTextLength 时可以通过这个方法来实现业务自定义的输入限制。在之前的版本里,自定义的输入限制和 maximumTextLength 是两个互斥的能力。
  4. 同上,QMUITextViewDelegate 也增加了方法 textView:shouldChangeTextInRange:text:originalValue:,原因不再赘述。
  5. UIImage (QMUI) 里的 qmui_imageWithTintColor:qmui_imageWithColor: 方法增加 QMUIAssert 用于辅助发现业务里“无法正确用一个 QMUIThemeColor 生成一张 QMUIThemeImage” 的场景。
  6. UITabBar (QMUI) 增加 qmui_effectViews 用于在 iOS 15 里获取所有的背景磨砂 view。

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

  1. 由于 QMUISlider 提供的功能没必要非要以子类的形式存在,因此这个版本我们删除了 QMUISlider,同时新增了功能更加强大的 UISlider (QMUI) 分类。
  2. 上个版本里,为了修复 #1320 的问题,引入了 #1320 (comment) 所述的新问题,经过考虑,这个版本我们回退了 4.4.0 里的改动(也即与 4.3.0 一致),至于 #1320 的问题,是 OC 和 Swift 语言特性导致的,QMUI 暂时不处理,业务请自行规避该用法。

如何适配新版

  1. 如果你的 App 是用 Xcode 13 打包的,请检查运行在 iOS 15 上时 QMUITheme 功能是否正常。
  2. 如果你的项目里有使用 QMUISlider,请将其改为 UISlider (QMUI) 里的对应属性(通常都是加个 qmui_ 前缀而已),或者也可以直接复制 QMUISlider.h/.m 到项目内继续使用。
  3. 请检查项目里继承自 QMUITableViewCell 并且重写了 initWithStyle:reuseIdentifier: 方法,但在业务使用时通过 initForTableView:withStyle:reuseIdentifier: 构造 cell 的场景,表现是否正常(预期应该与 4.3.0 保持一致)。
  4. 更新项目内的 QMUI 版本,运行起来后,请检查 Xcode 控制台是否输出“QMUIThemeColor 生成的图片却不是 QMUIThemeImage”字样的 log,如果有,意味着该处的 image 可能无法自动响应 theme 变化。

如果有使用配置表

  1. 请将配置表里 QMUILog 段落的位置迁移到 UIControl 的前面,这样才能保证其他模块在用到与 QMUILog 相关的开关时能读取到正确的值。

Bugfix

  1. #1236 由于新增的 UISlider (QMUI) 分类,顺便修复了 iOS 14 及以后的系统里无法正确获取到 thumbView 的 bug。
  2. #1247 修复 iOS 14 及以后的系统里,如果项目对一个 UIView 使用了 qmui_layoutSubviewsBlock 属性,则会导致在 iPad 里开启悬浮键盘时,聚焦一个带有 inputAccessoryView 的输入框时会死循环卡死的 bug。
  3. 修复开启了 NavBarRemoveBackgroundEffectAutomatically 后 iOS 15 里的 barTintColor 无法与 effectView 共存的 bug。
  4. #1335 修复 AutomaticCustomNavigationBarTransitionStyle 在前后两个导航栏的显隐状态不一致时表现错误的 bug。
  5. 修复 Xcode 13 编译的 App 在 iOS 15 下运行时,如果某个界面通过 QMUINavigationControllerAppearanceDelegate 系列方法控制自己的导航栏样式,则停留在该界面时切换 QMUITheme,导航栏样式会被覆盖为配置表的全局样式,而非该界面自己设置的值。
  6. 修复 -[NSString(QMUI) qmui_substringAvoidBreakingUpCharacterSequencesToIndex:] 方法在 index 刚好等于 string.length 时会 crash 的 bug:从语义上这样的 index 应当是合法的,此时需要返回当前 string 的 copy。
  7. 修复 UITabBar (QMUI).qmui_effectView 在 iOS 15 下无法正确获取到背景磨砂 view 的 bug,会导致 UITabBar (QMUI).qmui_effect 失效。
  8. 修复 QMUITableViewStyleInsetGrouped 的列表,每个 section 最后一个 cell 右下角的圆角丢失的 bug。

QMUI Demo

  1. 重新制作 UISlider (QMUI) 的 Demo。
  2. QMUIMarqueeLabel Demo 增加 UILabel (QMUI_Marquee) 功能的展示。
  3. 优化 QMUIInteractiveDebugPanelViewController 的使用方式,使其可以方便地以 subview 的形式添加到界面上显示,也可以配置自己项目的外观。
  4. UIImage (QMUI) Demo 增加渐变图片的展示。
  5. UITextField (QMUI) Demo 增加对自定义内容格式限制的展示。