Skip to content

4.2.2

Compare
Choose a tag to compare
@MoLice MoLice released this 06 Jan 09:43
· 57 commits to master since this release

新增功能

  1. UINavigationController (QMUI) 增加方法 qmui_didInitialize 方便子类重写 init 时的逻辑,因为系统的 UINavigationController 总共有4个 NS_DESIGNATED_INITIALIZER,子类每次都重写这4个方法成本过高也容易遗漏。
  2. UINavigationController (QMUI) 增加 QMUINavigationAction 枚举用于标志当前 navigationController 的导航动作状态,并提供对应的 qmui_navigationAction qmui_addNavigationActionDidChangeBlock: 方法便于在某些导航动作产生时做一些事情,免去每个地方自己 hook/override 一遍 setViewControllers、pushViewController、popViewController、popToViewController、... 的麻烦(且 pop 操作有多种,容易遗漏)。
  3. - [QMUINavigationControllerAppearanceDelegate titleViewTintColor] 接口现在对系统的 title 也可以生效(以前仅对 QMUINavigationTitleView 才生效)。
  4. 增加 UINavigationItem (QMUI),提供多个接口方便访问关联的 navigationBar、navigationController 等信息。
  5. UIViewController (QMUI) 增加 qmui_isDescendantOfViewController: 用于判断当前 vc 是否为指定 vc 本身,或者是其 childViewController、childViewController 的 childViewController、...。
  6. QMUIHelper 增加系列接口对应新发布的 iPhone 设备:
    1. is67InchScreen
    2. is61InchScreenAndiPhone12
    3. is54InchScreen
    4. screenSizeFor67Inch
    5. screenSizeFor61InchAndiPhone12
    6. screenSizeFor54Inch
  7. #1146 @ZenonHuang QMUIHelper 更新 deviceName 以兼容新发布的设备。
  8. QMUIHelper 增加方法 isMac、QMUICommonDefines.h 增加宏 IS_MAC 用于区分是否 Mac Catalyst App 或 iOS 项目直接在 M1 设备上运行的情况。
  9. QMUICommonDefines.h 增加宏 PreferredValueForInterfaceIdiom(_phone, _pad) 用于区分 phone、pad 两种情况,注意当 iPad 分屏时,如果 App 窗体宽度较窄,也会被视为 phone。
  10. QMUIRuntime.h 增加 qmui_exists_dyld_image 函数用于检测是否存在某个 dyld image。
  11. UITextField (QMUI) 增加方法 qmui_convertNSRangeFromUITextRange:qmui_convertUITextRangeFromNSRange: 便于类型转换。
  12. - [QMUIModalPresentationViewControllerDelegate shouldHideModalPresentationViewController:] 现在支持所有显示类型了,之前仅对 window 方式有效。
  13. #1142 QMUIOrderedDictionary 增加 allValues 属性。
  14. #1108 #1113 配置表增加 NavBarContainerClasses 用于限定 NavigationBar 系列开关的生效范围,增加 TabBarContainerClasses 用于限定 TabBar 系列开关的生效范围,增加 ToolBarContainerClasses 用于限定 Toolbar 系列开关的生效范围,从而避免配置表的样式影响系统界面(例如从业务 App 里打开的相册、通讯录、打印等系统界面)。
  15. 配置表增加 TabBarItemTitleFontSelected 用于设置选中状态的 UITabBarItem 的字体。

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

  1. -[QMUINavigationController didInitialize] 被标记为废弃,将会在后续版本中被移除,请尽快将其替换为 qmui_didInitialize
  2. 废弃配置表的 ShouldFixTabBarButtonBugForAll,改为强制自动修复 #410 描述的系统 bug,因为这种 bug 正常情况下没有“不希望被修复”的诉求。
  3. 修正 CALayer (QMUIViewAnimation). qmui_viewAnimationEnabled 拼写错误的问题。
  4. 将若干类方法的定义改为类属性(@property (class)),便于访问。
  5. 删除 - [UITabBarItem (QMUIConfiguration) qmui_updateTintColorForiOS12AndEarlier:] 方法。

如何适配新版

  1. 检查项目里继承自 QMUINavigationController 的所有子类是否有实现 didInitialize 方法,有的话请将其替换为 qmui_didInitialize
  2. 全局搜索“qmui_viewAnimaitonEnabled”,将其替换为“qmui_viewAnimationEnabled”。
  3. 全局搜索“qmui_updateTintColorForiOS12AndEarlier”,清理用到的地方。
  4. 如果你是 Swift 项目,类方法改为类属性可能会导致你的语法需要从 QMUIHelper.deviceName() 替换为 QMUIHelper.deviceName,由于数量众多,请遇到报错时自行修改。

如果有使用配置表

  1. 删除配置表的 ShouldFixTabBarButtonBugForAll 项。
  2. 将以下代码添加到配置表中并修改为希望的值:
    QMUICMI.navBarContainerClasses = nil; // NavBarContainerClasses : NavigationBar 系列开关被用于 UIAppearance 时的生效范围(默认情况下除了用于 UIAppearance 外,还用于实现了 QMUINavigationControllerAppearanceDelegate 的 UIViewController),默认为 nil。当赋值为 nil 或者空数组时等效于 @[UINavigationController.class],也即对所有 UINavigationBar 生效,包括系统的通讯录(ContactsUI.framework)、打印等。当值不为空时,获取 UINavigationBar 的 appearance 请使用 UINavigationBar.qmui_appearanceConfigured 方法代替系统的 UINavigationBar.appearance。请保证这个配置项先于其他任意 NavBar 配置项执行。
    QMUICMI.tabBarContainerClasses = nil; // TabBarContainerClasses : TabBar 系列开关的生效范围,默认为 nil,当赋值为 nil 或者空数组时等效于 @[UITabBarController.class],也即对所有 UITabBar 生效。当值不为空时,获取 UITabBar 的 appearance 请使用 UITabBar.qmui_appearanceConfigured 方法代替系统的 UITabBar.appearance。请保证这个配置项先于其他任意 TabBar 配置项执行。
    QMUICMI.toolBarContainerClasses = nil; // ToolBarContainerClasses : ToolBar 系列开关的生效范围,默认为 nil,当赋值为 nil 或者空数组时等效于 @[UINavigationController.class],也即对所有 UIToolbar 生效。当值不为空时,获取 UIToolbar 的 appearance 请使用 UIToolbar.qmui_appearanceConfigured 方法代替系统的 UIToolbar.appearance。请保证这个配置项先于其他任意 ToolBar 配置项执行。
    QMUICMI.tabBarItemTitleFontSelected = nil; // TabBarItemTitleFontSelected : 选中的 UITabBarItem 的标题字体

Bugfix

  1. 修复 +[QMUIHelper safeAreaInsetsForDeviceWithNotch] 不准确的 bug。
  2. 修复 StatusBarHeightConstant 宏不准确的 bug。
  3. 修复 QMUICommonViewController 内置的 QMUINavigationTitleView 无法响应 UIViewController.navigationItem.title 的值的 bug。
  4. 修复 dismiss 到一个正在搜索的界面时,状态栏无法正确交给 UISearchController,而是错误地交给 searchController 背后的 vc 的 bug。
  5. 修复开启了配置表 NeedsBackBarButtonItemTitle 的情况下,业务自己设置的 UIViewController.navigationItem.backBarButtonItem 会被强制覆盖的 bug。
  6. 修复 iOS 12 及以下的系统,通过 [UITabBarItem setTitleTextAttributes:forState:] 设置的 selected 字体无法生效的系统 bug(颜色可以生效,字体不行)。
  7. 修复开启了转场动画过程中 navigationBar 效果优化功能后,在转场动画过程中前后界面的样式发生变化,此时无法正确更新假 bar 的问题。
  8. #1087 修复使用了 QMUITheme 后,在 iOS 14 下首次升起键盘会触发 Main Thread Checker 警告的问题,4.2.1 里只是优化,4.2.2 里彻底修复。
  9. #1115 修复 QMUI 某些 description 可能触发 Main Thread Checker 的 bug。
  10. #1120 修复 QMUITextView 点击候选词触发最长字符数限制时,高度变化的回调 newHeightAfterTextChanged 不会调用的 bug。
  11. #1122 修复 QMUITheme 在切换主题时无法刷新 UITabBarItem.selectedImage 的 bug。
  12. #1130 修复配置表 NeedsBackBarButtonItemTitlebackBarButtonItemTitleWithPreviousViewController: 与系统的 backBarButtonItem 三者互相冲突的问题。
  13. #1148 修复 - [QMUIEmptyView sizeThatContentViewFits:] 高度计算错误的 bug。
  14. #1149 修复 QMUIZoomImageView 在 image/livePhoto/videoPlayerItem 三种内容之间切换时没有清空其他内容,导致缩放错误的 bug。
  15. #1150 修复 QMUIModalPresentationViewController hide 时没有正确清空 keyboardHeight 的 bug。
  16. #1156 修复 QMUICommonTableViewController 搭配 Storyboard 使用时 crash 的问题。
  17. #1163 修复 QMUIPieProgressView 使用约束布局时圆角有误的 bug。
  18. #1168 #1170 修复 QMUITextFieldQMUITextView 设置了 maximumTextLength 后,在配合系统的三指粘贴/撤销快捷操作时可能引发 crash 的 bug。
  19. #1169 修复 iPad 12-inch 上一旦出现了 QMUIConsole,界面上其他元素就无法点击的 bug。
  20. #1173 修复 QMUIKeyboardManager 无法兼容系统的“设置→辅助功能→动态效果→减弱动态效果→首选交叉淡出过渡效果”的问题。

其他

  1. 优化配置表 PreventConcurrentNavigationControllerTransitions 功能,在切换界面时如果上一次转场动画尚未结束,以前直接屏蔽本次切换,现改为将本次切换的 animated 置为 NO,既能避免 bug,又能允许界面正常切换。
  2. 优化 UIView (QMUI)UIImageView (QMUI) 内部若干 hook,将 hook 时机从 +load 改为按需。
  3. #1100 iOS 14.2 开始,系统已经修复了该问题,因此 QMUI 新版本里对 iOS 14.2 及以后的版本都屏蔽了相关代码。