Skip to content

Releases: Tencent/QMUI_iOS

4.0.4

09 Dec 10:09
Compare
Choose a tag to compare

新增功能

  1. UISwitch (QMUI) 增加 qmui_offTintColor 属性用于控制关闭时的背景色,对应地,配置表也增加了配置项 SwitchOffTintColor
  2. UILabel (QMUI) 增加 QMUILineHeightIdentity 用于重置 qmui_lineHeight 设置过的行高。
  3. #845 by @saucym NSArray (QMUI) 增加 qmui_mapWithBlock: 方法用于将数组的 item 转成别的类型。

如何适配新版

  1. 如果有使用配置表,请将以下代码添加到配置表:
    QMUICMI.switchOffTintColor = nil; // SwitchOffTintColor : UISwitch 关闭时的背景色(除了圆点外的其他颜色)

Bugfix

  1. #801 修复不同的 QMUIPopupContainerView 实例在同一个 UIBarButtonItem 上显示时,只有第一个浮层能正常显示的 bug。
  2. #802 修复 UIFont(QMUI) 在 iOS 13 下无法获取到正确的 Light 字体的 bug。
  3. #812 修复 QMUIMarqueeLabel 某些情况下无法看到文字的 bug。
  4. #813 修复 iOS13 以下应用内切换主题后 UITabBarItem 图片颜色不跟随主题变化的 bug。
  5. #814 修复 -[UINavigationController setViewControllers:]NeedsBackBarButtonItemTitle 不生效的 bug。
  6. #830 修复 iOS 13 UISearchBar.qmui_placeholderColor 在某些时机下设置时无效。
  7. #842 修复 QMUIFloatLayoutView.itemMargins 对处于外边缘(四条边上)的 item 会错误计算布局的 bug。

4.0.3

31 Oct 09:29
Compare
Choose a tag to compare

新增功能

  1. QMUINavigationTitleView 增加属性 adjustsSubviewsTintColorAutomatically,从而支持为 titleLabelsubtitleLabelloadingView 设置不同的颜色,在此之前这些 subviews 的颜色都只能与 titleView.tintColor 一致。
  2. QMUIDynamicColorProtocol 增加属性 qmui_isQMUIDynamicColor 用于区分当前 color 对象是否为 QMUIThemeColor
  3. UIView (QMUITheme) 增加属性 qmui_themeDidChangeBlock 用于方便地监听 QMUITheme 的变化,而无需继承重写一个 subclass。

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

  1. #765 在 4.0.2 版本里由于 QMUI 对以 CocoaPods 方式使用的场景,规定了必须使用 use_frameworks!,导致某些使用了老旧第三方框架的项目会出错,因此这个版本里我们重新恢复对 static framework 的支持,不管是否添加 use_frameworks! 都可以正常使用,这里感谢 0x1306a94 的技术支持。

如何适配新版

  1. 如果需要,你可以去掉 4.0.2 版本强制在 Podfile 里加上的 use_frameworks!

Bugfix

  1. #767 修复当键盘正在显示时发生了 QMUITheme 的切换并修改了 keyboardAppearance,但键盘却没有更新外观的 bug。
  2. #768 修复 iOS 13 下 QMUIDialogViewController 设置了 titleLabelTextColor 后第二次 show 出来时颜色错误的 bug。
  3. #776 修复使用 OverrideImplementation() 替换了未实现的方法会导致消息转发机制失效的 bug。
  4. #777 修复 UITextField 聚焦时无法通过 setNeedsDisplay 刷新文字颜色的 bug。
  5. #791 修复开启了手机的”辅助功能-增强对比度“后会出现”-[QMUIThemeColor _highContrastDynamicColor]: unrecognized selector sent to instance“ crash 的 bug。
  6. 修复 UISearchBar.barTintColor 设置了一个 QMUIThemeColor 后当主题变化时无法刷新颜色的 bug。
  7. 修复当键盘因点击 WKWebView 而降下时,dismiss 事件无法触发 QMUIKeyboardManagerDelegate 回调的 bug。
  8. 修复键盘的 keyboardAppearance 可能与 QMUITheme 产生冲突导致主题错乱的 bug。

4.0.2

12 Oct 13:46
Compare
Choose a tag to compare

新增功能

  1. 新增 UITabBarAppearance (QMUI),提供方法 qmui_applyItemAppearanceWithBlock: 用于在 iOS 13 下方便地设置 UITabBarAppearance

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

  1. 从 4.0.1 版本开始,QMUI 不再支持以 static framework 方式引入,官网的《开始使用》文档里也已做了相应更新。 从 4.0.3 开始重新支持了 static framework,请使用 QMUI 最新版本。
  2. QMUIHelper 废弃 resourcesBundleresourcesBundleWithName:imageInBundle:withName: 方法。

如何适配新版

  1. 如果你使用 CocoaPods 的方式引入 QMUI,请确保你的 Podfile 里声明了 use_frameworks!
  2. 全局搜索 “[QMUIHelper resourcesBundle”、“[QMUIHelper resourcesBundleWithName”、“[QMUIHelper imageInBundle”,将使用到的地方删除。

Bugfix

  1. #736 修复配置表的 TabBarItemImageColor 会覆盖 UIImageRenderingModeAlwaysOriginal 的 image 颜色的 bug。
  2. #737 修复使用自定义返回按钮后,在某些情况下切界面时可以看到按钮跳动的 bug。
  3. #739 修复 QMUIPopupMenuButtonItem 修改实例的 imageMarginRight 无效的 bug。
  4. #740 修复 iOS 的 bug:在 iOS 13 下通过 UITabBarAppearance 为 tabBarItem 设置字号大于10时,item 的文字会被截断。
  5. #741 去掉 QMUIKit 里对 UIWebView 的使用。
  6. #743 修复使用 UISearchController 配合 qmui_usedAsTableHeaderView,在进入搜索时能看到一个黑色遮罩一闪而过的 bug。
  7. #746 修复以 CocoaPods 方式使用 QMUI,启动时会在 Xcode 控制台输出“[framework] CoreUI: RunTimeThemeRefForBundleIdentifierAndName() couldn't find Assets.car in bundle with identifier: 'QMUI.QMUIResources'”的 log 的问题。
  8. #751 修复 QMUIDialogViewController.buttonTitleAttributes 指定了颜色,在 dialog hide 后再重新 show 时,按钮的颜色被重置回默认颜色的 bug。
  9. #754 修复 iPad 下,或 iPhone 横屏时,配置表里 UITabBar 的样式失效的 bug。
  10. 修复 QMUIThemeImage 在某些情况下可能产生的 crash。
  11. 修复 present 起来的 viewController 在 QMUITheme 发生变化时无法响应 qmui_themeDidChangeByManager:identifier:theme: 的 bug。
  12. 修复 QMUIModalPresentationViewController 内部的 contentViewController 无法响应 qmui_themeDidChangeByManager:identifier:theme: 的 bug。
  13. 更换 UIView (QMUI).qmui_layoutSubviewsBlock 的实现方式,从而修复以 QMUIBadge 的方式显示 UITabBar 未读红点时,可能看到未读红点跳动的 bug。

4.0.0

27 Sep 14:00
Compare
Choose a tag to compare

重要说明

QMUI 4.0.0 更新内容主要是兼容 iOS 13,如你正使用的 QMUI 版本低于 4.0.0-beta,建议即刻起升级到 4.0.0,旧版本的 QMUI 在 iOS 13 上产生的任何问题我们均不再处理。

与 4.0.0-beta 的关系

4.0.0 和 4.0.0-beta 是两个独立的正式版本,由于 Apple 从发布 iOS 13 beta1 到发布 iOS 13 正式版,期间耗时较长,因此 QMUI 对 iOS 13 的兼容也分成两个版本发布,对于业务项目,理想的升级路径是先升级到 4.0.0-beta,再升级到 4.0.0,因此 4.0.0 的 Release Note 是针对从 4.0.0-beta 升级上来的项目而撰写的,如果你直接从 3.x.x 升级到 4.0.0,需要同时参照 4.0.0-beta 和 4.0.0 两份 Release Note(这个道理就跟从 3.1.9 跳过 3.2.0 直接升级到 3.2.1 一样,也是需要参考两份 Release Note 进行操作)。

QMUITheme 的变化

QMUITheme 组件增加 QMUIThemeManagerCenter,用于支持同一个项目里存在多个维度的主题。以“微信读书”为例,整个 App 拥有 light/dark 两套主题,生效于所有界面,而阅读器自身又拥有 4 套主题(白/黄/绿/黑),通过 QMUIThemeManagerCenter 才能让这两个维度的主题共存在同一个项目里,保证阅读器的 color/image/effect 只响应阅读器的 4 套主题,不受外面 light/dark 切换的影响。相应地,之前升级到 4.0.0-beta 并使用了 QMUITheme 的项目也需要跟着调整,具体请看 如何适配新版

基于此调整,UIColor (QMUITheme)、UIImage (QMUITheme)、UIVisualEffect (QMUITheme) 均增加了新的 init 方法来初始化不同维度主题下的动态对象,没有多维度主题需求的项目请继续使用之前的方式创建动态对象。

@interface UIColor (QMUITheme)
+ (UIColor *)qmui_colorWithThemeManagerName:(__kindof NSObject<NSCopying> *)name provider:(UIColor *(^)(__kindof QMUIThemeManager *manager, __kindof NSObject<NSCopying> * _Nullable identifier, __kindof NSObject * _Nullable theme))provider;
@end

@interface UIImage (QMUITheme)
+ (UIImage *)qmui_imageWithThemeManagerName:(__kindof NSObject<NSCopying> *)name provider:(UIImage *(^)(__kindof QMUIThemeManager *manager, __kindof NSObject<NSCopying> * _Nullable identifier, __kindof NSObject * _Nullable theme))provider;
@end

@interface UIVisualEffect (QMUITheme)
+ (UIVisualEffect *)qmui_effectWithThemeManagerName:(__kindof NSObject<NSCopying> *)name provider:(UIVisualEffect *(^)(__kindof QMUIThemeManager *manager, __kindof NSObject<NSCopying> * _Nullable identifier, __kindof NSObject * _Nullable theme))provider;
@end

-[UIView (QMUITheme) qmui_registerThemeColorProperties:] 方法之前只支持注册 UIColor 类型的 property,现在它支持所有 NSObject 类型的 property了。

CAShapeLayerfillColorstrokeColor,以及 CAGradientLayercolors,都支持 QMUIThemeColor 了。

对于 QMUIThemeImage,之前我们要求在 provider block 里不要做耗时的操作,现在也不需要担心这个问题,因为 QMUIThemeImage 内部增加了缓存。

新增功能

  1. UINavigationController (QMUI) 增加 qmui_isPushingqmui_isPoppingqmui_topViewController
  2. QMUICommonDefines.h 增加宏 QMUIStatusBarStyleDarkContent 用于 iOS 13 下不管当前是 Light/Dark Mode,都希望状态栏显示为黑色文字内容的场景,作为 -[UIViewController preferredStatusBarStyle] 的返回值使用。
  3. QMUIHelper 增加 deviceName 方法用于获取当前设备的产品名称,例如 iPhone 11 Pro Max,而屏幕尺寸判断的系列方法也对2019年9月发布的新设备进行了兼容。
  4. QMUINavigationControllerAppearanceDelegate 增加方法 navigationBarStyle 用于控制导航栏的 style。
  5. UIViewController (QMUI) 增加 qmui_animateAlongsideTransition:completion: 用于在转场过程中让一些操作跟随转场动画一起呈现出来。
  6. UISearchBar (QMUI) 增加 qmui_generateTextFieldBackgroundImageWithColor: 用于生成搜索框内的输入框背景图,增加 qmui_generateBackgroundImageWithColor:borderColor: 用于生成搜索框的背景图。
  7. 配置表增加 NavBarShadowImageColor 用于以颜色的方式设置导航栏分隔线。
  8. 配置表增加 TabBarItemImageColor 用于设置 UITabBarItem 未选中时的图片颜色。
  9. 配置表增加 TabBarItemImageColorSelected 用于设置 UITabBarItem 选中时的图片颜色。
  10. 配置表增加 SearchBarTextFieldBackgroundImage,废弃 SearchBarTextFieldBackground,以支持直接设置一个 UIImage 作为搜索框内的输入框背景,通过 iOS 13 的方式指定一个支持 Dark Mode 的 image asset,即可让搜索框里的输入框也支持 Dark Mode。
  11. 配置表增加 SearchBarBackgroundImage,废弃 SearchBarBottomBorderColorSearchBarBarTintColor ,以支持直接设置一个 UIImage 作为搜索框的背景图,通过 iOS 13 的方式指定一个支持 Dark Mode 的 image asset,即可让搜索框背景也支持 Dark Mode。

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

  1. QMUINavigationControllerAppearanceDelegate 删除之前已被标记为废弃的方法 shouldSetStatusBarStyleLight
  2. QMUIHelper 删除之前已被标记为废弃的方法 renderStatusBarStyleDarkrenderStatusBarStyleLight
  3. QMUIConfiguration 删除 tabBarTintColor 属性,用新增的 tabBarItemImageColortabBarItemImageColorSelected 配合之前已有的 tabBarItemTitleColortabBarItemTitleColorSelected 来实现对 UITabBarItem 更精准的样式配置。
  4. QMUIConfiguration 删除 searchBarBottomBorderColorsearchBarBarTintColor 属性,改为用新增的 searchBarBackgroundImage 代替。
  5. UISearchBar (QMUI) 里,对于 iOS 11 及以后的系统,搜索框内的输入框背景图的高度从 28 改为 36,以保持与系统默认高度一致,请知悉。
  6. 相册选择控件里,对于“已隐藏”相簿,排序会强制放到相簿列表的最后面。

如何适配新版

  1. 全局搜索“[QMUIThemeManager sharedInstance]”,将其替换为“QMUIThemeManagerCenter.defaultThemeManager”。
  2. 全局搜索对 shouldSetStatusBarStyleLight 的使用并将其换成系统的 preferredStatusBarStyle 方法。
  3. 全局搜索 ”[QMUIHelper renderStatusBarStyleDark]“、”[QMUIHelper renderStatusBarStyleLight]“ 并将其删除,改为使用系统的 setNeedsStatusBarAppearanceUpdate

如果你有使用配置表

  1. 增加以下代码到配置表里:

    QMUICMI.navBarShadowImageColor = nil; // NavBarShadowImageColor : UINavigationBar.shadowImage 的颜色,如果为 nil,则显示系统默认 shadowImage,如果为全透明,则不显示 shadowImage,如果为除了 nil 和全透明外的其他颜色,则会将这个颜色叠加到 NavBarShadowImage 上显示出来,如果不存在 NavBarShadowImage,则使用一张 1px 高的图片作为默认图。
  2. 删除 TabBarTintColor,并增加以下代码:

    QMUICMI.tabBarItemImageColor = xxx; // TabBarItemImageColor : UITabBarItem 未选中时的图片颜色
    QMUICMI.tabBarItemImageColorSelected = xxx; // TabBarItemImageColorSelected : UITabBarItem 选中时的图片颜色
  3. 删除 SearchBarTextFieldBackground,改为用新的 SearchBarTextFieldBackgroundImage,如果需要以代码的方式生成输入框的背景图,可使用新增的 + [UISearchBar (QMUI) qmui_generateTextFieldBackgroundImageWithColor:]

    QMUICMI.searchBarTextFieldBackgroundImage = [UISearchBar qmui_generateTextFieldBackgroundImageWithColor:xxx]; // SearchBarTextFieldBackgroundImage : QMUISearchBar 里的文本框的背景图,图片高度会决定输入框的高度
  4. 删除 SearchBarBottomBorderColorSearchBarBarTintColor,并增加以下代码:

    QMUICMI.searchBarBackgroundImage = [UISearchBar qmui_generateBackgroundImageWithColor:xxx borderColor:xxx]; // SearchBarBackgroundImage : 搜索框的背景图,如果需要设置底部分隔线的颜色也请绘制到图片里

Bugfix

  1. #618 修复配置表的 TabBarShadowImage 在 iOS 13 下不生效的 bug,由于这里使用了 iOS 13 新增的 UITabBarAppearance 来设置,会导致以前那种设置样式的接口不生效或有问题,这是系统的限制,因此我们在 UITabBar (QMUI) 里对旧版本接口做了兼容,如果你在 iOS 13 下使用旧版本的接口,会帮你转换成新版本的接口来使用,请知悉。
  2. #629 修复某些特定情况下手势返回过程中,上一个界面的 navigationBar 被隐藏的 bug。
  3. #639 修复 QMUIModalPresentationViewController 以 showInView 的方式显示在 vc.view 上后,如果 push 界面再回来,vc 上的 modal 会消失的 bug。
  4. #649 修复显示带输入框的 QMUIAlertController 时会提示 becomeFirstResponder 错误的 bug。
  5. #654 修复 push/pop 时 UINavigationBar 返回按钮的文字颜色错误的 bug。
  6. #659 #701 修复 iOS 13 下 UIMenuControllerwindowLevel 变化引发的一系列菜单不可见的问题。
  7. #663 修复 QMUIMutipleDelegates 无法正确响应 conformsToProtocol: 的 bug。
  8. #679 修复 QMUIPopupContainerViewUIScrollView 里使用时的布局 bug。
  9. #680 修复 UIKit 在 UISearchController 显示搜索结果的时候进行 push/pop 操作后可能产生的界面异常的 bug。
  10. #692 修复 present 一个 QMUINavigationController 时,rootViewControllernavigationBarTintColor 无效的 bug。
  11. #693 修复 iOS 13.0 把 UIButton 作为 UITableViewCellaccessoryView 使用时会出现布局错误的 bug,iOS 13.1 不会。
  12. #698 修复 QMUICommonViewController 在调用 showEmptyView 之前访问不到 self.emptyView 的问题。
  13. #700 修复存在 present viewController 的情况下 QMUITheme 无法正确更新界面的 bug。
  14. #715 修复 4.0.0-beta 里对 viewController 横竖屏方向的控制有问题的 bug。
  15. 修复 DEVICE_WIDTHDEVICE_HEIGHT 在某些情况下计算不准确的 bug。
  16. 修复 QMUICollectionViewPagingLayoutcollectionView.bounces = NO 时会产生滚动异常的 bug。
  17. 修复 iOS 10、11 下使用 QMUIThemeColor 作为 UILabel.attributedText 的 foregroundColor,当主题发生变化时无法正确刷新文字颜色的 bug。
  18. 修复 iOS 11 及以下使用 QMUIThemeColor 作为 UITextView.typingAttributes 的 foregroundColor,当主题发生变化时无法正确刷新文字颜色的 bug。
  19. 修复使用 Xcode 11 编译到 iOS 9.0 上启动后会因为 Symbol not found: OBJC_CLASS$_PHLivePhotoRequestOptions 而 crash 的系统 bug。

4.0.0-beta

21 Jul 11:36
Compare
Choose a tag to compare
4.0.0-beta Pre-release
Pre-release

重要说明

QMUI 4.0.0-beta 更新内容主要包含 iOS 13 的兼容(#615)、新增对应 Dark Mode 的换肤组件 QMUITheme、支持 iPad Slide Over/Split View(分屏)。由于与 iOS 13 相关的功能仅在使用 Xcode 11 Beta 编译时才保证正常,因此若使用 Xcode 10 编译则在 iOS 13 Beta 的设备上运行时可能产生非预期的效果,知会。

由于 iOS 13 尚未正式发布,因此 4.0.0 暂时以 pre-release 性质发布,短期内将会继续完善并发布 4.0.0 正式版,如业务项目有计划兼容 iOS 13,建议即刻升级到此版本,以减少后期的升级成本。

新增功能

  1. 适配 iOS 13,#615 列出了目前遇到的所有兼容问题,其中主要的问题是 iOS 13 系统会对某些 KVC 访问抛出异常,针对这个问题,我们提供3种方式解决:
    1. [推荐] 打开配置表新增的 IgnoreKVCAccessProhibited,即可全局屏蔽 iOS 13 KVC 异常,适用于大量使用 KVC 的场景,也不需要修改业务代码。
    2. 使用 NSObject (QMUI) 新增的 qmui_valueForKey:qmui_setValue:forKey: 代替系统的方法,适用于频次较少的 KVC,也便于通过全局搜索替换的方式来兼容。
    3. 使用新增的 BeginIgnoreUIKVCAccessProhibitedEndIgnoreUIKVCAccessProhibited 宏,将有问题的 valueForKey:setValue:forKey: 包裹起来,从而屏蔽被包裹的代码块可能产生的异常,适用于频次较少的 KVC。
  2. 支持 iPad 分屏的适配:
    1. 增加 QMUIWindowSizeMonitor 用于适配 iPad 分屏下的布局。
    2. QMUIHelper 增加方法 applicationSize (对应宏 APPLICATION_WIDTHAPPLICATION_HEIGHT)用于获取分屏后的 App 视窗大小,建议不管适不适配 iPad 分屏,都使用这个方法来代替 UIScreen.mainScreen.bounds.size
    3. 增加宏 IS_SPLIT_SCREEN_IPAD 用于判断当前是否处于分屏。
    4. 增加宏 IPAD_SIMILAR_SCREEN_WIDTH 用于计算分屏后的尺寸近似于哪个 iPhone 设备的尺寸。
    5. PreferredValue 系列宏在打开了新的配置表项 DynamicPreferredValueForIPad 后,支持将分屏后的 iPad 视为某个 iPhone 的设备来布局。
  3. 增加 QMUITheme 组件用于适配 iOS 13 的 Dark Mode,同时也支持 iOS 12 及以下系统的使用,使用文档请查看 Wiki,Demo 请查看 Components->QMUITheme。
  4. 增加 QMUIAnimation 组件用于实现复杂动画。
  5. QMUINavigationButton 增加 adjustsImageTintColorAutomatically 属性便于控制图片和文字都跟随 tintColor 变化。
  6. QMUIKeyboardManager 增加 ignoreApplicationState 属性用于响应所有 UIApplicationState 下的键盘事件,同时解决 #565 提到的问题。
  7. QMUIPieProgressView 增加 shapelineWidth 等属性用于支持新的环状样式。
  8. QMUILabelhighlightedBackgroundColor 属性支持 UIAppearance
  9. UIView (QMUI) 增加 qmui_tintColorCustomized 属性用于判断当前 view 是否有设置过自定义的 tintColor。
  10. UITableViewCell (QMUI) 增加 qmui_selectedBackgroundColor 用于便捷地设置点击高亮时的背景色(否则你需要先初始化一个 selectedBackgroundView
  11. UITableViewCell (QMUI) 增加 qmui_styledAsQMUITableViewCell 方法用于按照 QMUI 配置表的样式去配置一个 cell。
  12. 原本属于 UITableView (QMUI) 的属性 qmui_initialContentInset 已被迁移到 UIScrollView (QMUI)
  13. 增加 UITraitCollection (QMUI) 以在 iOS 13 的 Dark Mode 发生切换前收到通知。
  14. CALayer (QMUI) 增加 qmui_isRootLayerOfView 属性用于判断当前的 layer 是否是某个 UIView 自带的 layer。
  15. CALayer (QMUI) 增加 qmui_performWithoutAnimation: 方法用于以无动画的形式修改 layer 属性。
  16. NSMethodSignature (QMUI) 增加 qmui_avoidExceptionSignature 方法用于生成一个避免 crash 的方法签名。
  17. NSString (QMUI) 增加 qmui_capitalizedString 用于把首字母转换为大写,系统的 capitalizedString 会强制把除首字母外的其他字母转换成小写。
  18. NSObject (QMUI) 增加若干方法便于调试时用:
    1. qmui_methodList 列出当前对象的所有方法(含继承)。
    2. qmui_shortMethodList 列出当前对象的所有方法(不含父类继承)。
    3. qmui_ivarList 列出当前对象的所有成员变量。
  19. QMUICommonDefines.h 增加函数 setterWithGetter 用于获取给定 getter 对应的 setter。
  20. 配置表增加 KeyboardAppearance 开关用于控制全局输入框默认的键盘样式。
  21. 配置表增加 NavBarStyleTabBarStyleToolBarStyle 用于控制全局的 bar 的样式。
  22. 配置表增加 UISwitch 相关样式设置,具体请查看下方 如何适配新版
  23. 配置表针对 Grouped 类型的 UITableView 增加若干项目,具体请查看下方 如何适配新版
  24. 配置表增加 AdjustScrollIndicatorInsetsByContentInsetAdjustment 便于兼容 iOS 13 下新增的 -[UIScrollView automaticallyAdjustsScrollIndicatorInsets] 属性。

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

  1. UINavigationControllerBackButtonHandlerProtocol 协议里的 shouldHoldBackButtonEventcanPopViewController 已被标记为废弃,请使用 shouldPopViewControllerByBackButtonOrPopGesture: 代替。
  2. QMUIMoreOperationControllercontentEdgeMargin 属性类型从 CGFloat 改为 UIEdgeInsets ,同时重命名为 contentEdgeMargins,以便于灵活控制面板的布局。
  3. QMUITableViewCell 支持样式区分 Plain、Grouped 列表下的样式,因此内部的 didInitializeWithStyle: 调用时机发生了变化,导致继承 QMUITableViewCell 的子类如果在 initWithStyle:reuseIdentifier: 里设置 textLabel.textColordetailTextLabel.textColorself.backgroundColor,则这些设置将会被 QMUI 默认值覆盖。具体兼容方法请看下方 如何适配新版

如何适配新版

  1. 如果遇到 iOS 13 系统对 KVC 抛出的异常,可将配置表的 IgnoreKVCAccessProhibited 置为 YES,或将遇到异常的代码改为用 qmui_valueForKey:qmui_setValue:forKey:
  2. 全局搜索“shouldHoldBackButtonEvent”、“canPopViewController”,将其改为新的 shouldPopViewControllerByBackButtonOrPopGesture:
  3. 全局以 Matching Word 方式搜索 “contentEdgeMargin”,如果是 QMUIMoreOperationController 的属性,则将其改为 contentEdgeMargins,注意类型从 CGFloat 变为 UIEdgeInsets
  4. 检查业务所有继承自 QMUITableViewCell 的类,如果有重写 initWithStyle:reuseIdentifier:,请将该方法删掉,将原本的内容迁移到 didInitializeWithStyle: 里。
  5. 如果有使用配置表,请将以下代码复制到 QMUIConfigurationTemplate.m 中,并按照业务需求改为需要的值:
QMUICMI.keyboardAppearance = UIKeyboardAppearanceDefault; // KeyboardAppearance : UITextView、UITextField、UISearchBar 的 keyboardAppearance

QMUICMI.switchOnTintColor = nil; // SwitchOnTintColor : UISwitch 打开时的背景色(除了圆点外的其他颜色)
QMUICMI.switchTintColor = nil; // SwitchTintColor : UISwitch 关闭时的周围边框颜色
QMUICMI.switchThumbTintColor = nil; // SwitchThumbTintColor : UISwitch 中间的操控圆点的颜色

QMUICMI.navBarStyle = UIBarStyleDefault; // NavBarStyle : UINavigationBar 的 barStyle
QMUICMI.tabBarStyle = UIBarStyleDefault; // TabBarStyle : UITabBar 的 barStyle
QMUICMI.toolBarStyle = UIBarStyleDefault; // ToolBarStyle : UIToolbar 的 barStyle

QMUICMI.tableViewGroupedCellTitleLabelColor = TableViewCellTitleLabelColor; // TableViewGroupedCellTitleLabelColor : Grouped 类型的 QMUITableView cell 里的标题颜色
QMUICMI.tableViewGroupedCellDetailLabelColor = TableViewCellDetailLabelColor; // TableViewGroupedCellDetailLabelColor : Grouped 类型的 QMUITableView cell 里的副标题颜色
QMUICMI.tableViewGroupedCellBackgroundColor = TableViewCellBackgroundColor; // TableViewGroupedCellBackgroundColor : Grouped 类型的 QMUITableView cell 背景色
QMUICMI.tableViewGroupedCellSelectedBackgroundColor = TableViewCellSelectedBackgroundColor; // TableViewGroupedCellSelectedBackgroundColor : Grouped 类型的 QMUITableView cell 点击时的背景色
QMUICMI.tableViewGroupedCellWarningBackgroundColor = TableViewCellWarningBackgroundColor; // tableViewGroupedCellWarningBackgroundColor : Grouped 类型的 QMUITableView cell 在提醒状态下的背景色

QMUICMI.dynamicPreferredValueForIPad = NO; // 当 iPad 处于 Slide Over 或 Split View 分屏模式下,宏 `PreferredValueForXXX` 是否自动把 iPad 视为某种屏幕宽度近似的 iPhone 来取值。

if (@available(iOS 13.0, *)) {
    QMUICMI.ignoreKVCAccessProhibited = NO; // IgnoreKVCAccessProhibited : 是否全局忽略 iOS 13 对 KVC 访问 UIKit 私有属性的限制
    QMUICMI.adjustScrollIndicatorInsetsByContentInsetAdjustment = NO; // AdjustScrollIndicatorInsetsByContentInsetAdjustment : 当将 UIScrollView.contentInsetAdjustmentBehavior 设为 UIScrollViewContentInsetAdjustmentNever 时,是否自动将 UIScrollView.automaticallyAdjustsScrollIndicatorInsets 设为 NO,以保证原本在 iOS 12 下的代码不用修改就能在 iOS 13 下正常控制滚动条的位置。
}

Bugfix

  1. #632 修复 UIAlertController 在 QMUITabBarControllerQMUINavigationController 内 present 起来时会出现“[UIAlertController supportedInterfaceOrientations] was invoked recursively” 的 log 的 bug。
  2. #633 修复 NavigationBarHeightTabBarHeightToolBarHeight 在某些设备下不准确的 bug。
  3. #660 修复 QMUIAlertController 的一处内存泄露。
  4. 修复 QMUINavigationTitleView 在开启了 UINavigationBar.prefersLargeTitles 模式的情况下无法与大标题兼容的问题,LargeTitle 的 Demo 请查看 QMUIKit->QMUINavigationController->兼容 LargeTitle。
  5. 修复 iOS 10 在某些情况下手势返回取消,navigationBar 的按钮将会重叠的 bug。

3.2.1

28 May 05:02
Compare
Choose a tag to compare

Bugfix

  1. #607 更换 UIImageView (QMUI).qmui_smoothAnimation 的实现方式,从而修复 CIImage 转换成 UIImage 后无法显示的 bug。

其他更新

  1. #602 by @passerbyloo UITextField (QMUI).qmui_clearButtonImage 属性声明改为 nullable,支持通过设置为 nil 来将自定义的 clearButtonImage 恢复为系统默认的图片。
  2. 增加 UIColor (QMUI) 的单元测试。

3.2.0

10 May 10:27
Compare
Choose a tag to compare

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

  1. 重新整理了 NSObject (QMUI) qmui_performSelector: 系列方法,对被调用的 selector 的返回值是对象还是非对象进行接口上的区分,从而避免可能产生的野指针或内存泄露。

如何适配新版

  1. 全局搜索 qmui_performSelector,将用到的地方改为新的使用方式,具体使用方式请查看 .h 头文件注释。

Bugfix

  1. #585 修复 NSObject (QMUI) qmui_performSelector: 系列方法在32位设备(iPhone 5) iOS 10 上获取对象类型的 return 值时会产生野指针的 bug。

3.1.9

07 May 08:51
Compare
Choose a tag to compare

Bugfix

  1. #577 修复 UILabel 设置了 qmui_lineHeight 后再改变 label 的 font 不生效的 bug。
  2. #579 #583 修复 UINavigationController (QMUI) 里对 navigationBar:shouldPopItem: 的 swizzle 错误导致某些方法失效的 bug。
  3. #580 去掉 QMUIButton 多余的 layout 更新代码,避免某些场景下可能出现的 crash。
  4. #581 by @iMinder 修复 QMUILab.h 里某处宏的错误导致 Swift 下编译失败的问题。

3.1.8

30 Apr 18:08
Compare
Choose a tag to compare

新增功能

  1. UIImage (QMUI) 增加 qmui_animatedImageNamed:scale:qmui_animatedImageNamed: 方法用于读取 gif 文件。
  2. 增加 NSMethodSignature (QMUI),允许获取当前方法签名对应的 typeEncoding。
  3. QMUI Demo 增加 UIImageView (QMUI) 的示例,用于展示 qmui_smoothAnimation 的效果。

Bugfix

  1. #575 修复 iOS 9 下因 swizzle CALayer init 引发野指针,导致应用启动后 crash 的 bug。
  2. 修复 OverrideImplementation() 对原本没有该方法的 class 重写方法时会失效的 bug。

3.1.7

25 Apr 14:11
Compare
Choose a tag to compare

重要说明

以前版本的 QMUI 代码里 swizzle 的方案大都是用 QMUIRuntime.h 里的 ExchangeImplementations() 函数,但这种方式在某些情况下会导致代码不以预期方式运行(具体可看下方,或者 #567),因此这个版本里,我们修改了以前的另一个用于 swizzle 的函数 OverrideImplementation(),以 block 的方式去写 swizzle 后的方法内容,并解决 ExchangeImplementations() 的问题,建议以后默认都用这种方式去 swizzle,不再使用 ExchangeImplementations()

对于新方式,被 swizzle 的方法 return 值类型、参数数量及类型都会影响语法,所以我们提供了多个 Code Snippet 简化这个过程,具体可查看 QMUI iOS Code Snippets 里以 extendoverride 开头的系列,其中 extend 表示自动帮你先调用 super 的实现,再调用你自己的实现,所以只需要直接写你的实现即可,语法简洁,而 override 适用于需要手动管理 super 的调用时机(或者屏蔽 super 的调用),语法较为复杂,建议借助 Code Snippet 的占位符提示。以下是对应的 Code Snippet 汇总:

  • override_void_non_argv - 用 OverrideImplementation() 重写指定 class 的某个无返回值、无参数的方法实现
  • override_void_single_argv - 用 OverrideImplementation() 修改指定 class 的某个无返回值、带一个参数的方法实现
  • override_void_two_argvs - 用 OverrideImplementation() 修改指定 class 的某个无返回值、带两个参数的方法实现
  • override_return_non_argv - 用 OverrideImplementation() 修改指定 class 的某个带返回值、无参数的方法实现
  • override_return_single_argv - 用 OverrideImplementation() 修改指定 class 的某个带返回值、带一个参数的方法实现
  • override_return_two_argvs - 用 OverrideImplementation() 修改指定 class 的某个带返回值、带两个参数的方法实现
  • extend_void_non_argv - 用 ExtendImplementationOfVoidMethodWithoutArguments() 修改指定 class 的某个无返回值、无参数的方法实现
  • extend_void_single_argv - 用 ExtendImplementationOfVoidMethodWithSingleArgument() 修改指定 class 的某个无返回值、带一个参数的方法实现
  • extend_void_two_argvs - 用 ExtendImplementationOfVoidMethodWithTwoArguments() 修改指定 class 的某个无返回值、带两个参数的方法实现
  • extend_return_non_argv - 用 ExtendImplementationOfNonVoidMethodWithoutArguments() 修改指定 class 的某个带返回值、无参数的方法实现
  • extend_return_single_argv - 用 ExtendImplementationOfNonVoidMethodWithSingleArgument() 修改指定 class 的某个带返回值、带一个参数的方法实现
  • extend_return_two_argvs - 用 ExtendImplementationOfNonVoidMethodWithTwoArguments() 修改指定 class 的某个带返回值、带两个参数的方法实现

extend_void_non_argv 重写 [UIView layoutSubviews] 示例:

extend_void_non_argv

override_void_non_argv 重写 [UIView layoutSubviews] 示例:

override_void_non_argv

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

  1. 修改 OverrideImplementation 的参数类型,从而避免子类先 swizzle 后父类再 swizzle 同一个方法,会导致子类里丢失父类 swizzle 后的方法内容的问题。

如何适配新版

  1. 全局搜索 SEL originCMD, IMP originIMP,将其替换为 SEL originCMD, IMP (^originalIMPProvider)(void)
  2. 全局搜索 )originIMP;,将其替换为 )originalIMPProvider();
  3. 以后的 swizzle 需求建议都是用上文提到的 OverrideImplementation() 实现。

Bugfix

  1. #567 修复以静态库方式引入 QMUI 时会因为编译顺序的问题导致某些 swizzle 方法失效的 bug。
  2. #569 避免 _performBatchUpdates:completion: 私有 API 导致审核被拒绝的问题。
  3. #570 修复 UIScrollView 使用 qmui_maskedCorners 时会出现显示错误的 bug。
  4. 修复 NSObject (QMUI) -qmui_performSelector:withArguments: 会丢失第二个及以后的参数的 bug。