Releases: Tencent/QMUI_iOS
4.0.4
新增功能
UISwitch (QMUI)
增加qmui_offTintColor
属性用于控制关闭时的背景色,对应地,配置表也增加了配置项SwitchOffTintColor
。UILabel (QMUI)
增加QMUILineHeightIdentity
用于重置qmui_lineHeight
设置过的行高。- #845 by @saucym
NSArray (QMUI)
增加qmui_mapWithBlock:
方法用于将数组的 item 转成别的类型。
如何适配新版
- 如果有使用配置表,请将以下代码添加到配置表:
QMUICMI.switchOffTintColor = nil; // SwitchOffTintColor : UISwitch 关闭时的背景色(除了圆点外的其他颜色)
Bugfix
- #801 修复不同的
QMUIPopupContainerView
实例在同一个UIBarButtonItem
上显示时,只有第一个浮层能正常显示的 bug。 - #802 修复
UIFont(QMUI)
在 iOS 13 下无法获取到正确的 Light 字体的 bug。 - #812 修复
QMUIMarqueeLabel
某些情况下无法看到文字的 bug。 - #813 修复 iOS13 以下应用内切换主题后
UITabBarItem
图片颜色不跟随主题变化的 bug。 - #814 修复
-[UINavigationController setViewControllers:]
时NeedsBackBarButtonItemTitle
不生效的 bug。 - #830 修复 iOS 13
UISearchBar.qmui_placeholderColor
在某些时机下设置时无效。 - #842 修复
QMUIFloatLayoutView.itemMargins
对处于外边缘(四条边上)的 item 会错误计算布局的 bug。
4.0.3
新增功能
QMUINavigationTitleView
增加属性adjustsSubviewsTintColorAutomatically
,从而支持为titleLabel
、subtitleLabel
、loadingView
设置不同的颜色,在此之前这些 subviews 的颜色都只能与 titleView.tintColor 一致。QMUIDynamicColorProtocol
增加属性qmui_isQMUIDynamicColor
用于区分当前 color 对象是否为QMUIThemeColor
。UIView (QMUITheme)
增加属性qmui_themeDidChangeBlock
用于方便地监听QMUITheme
的变化,而无需继承重写一个 subclass。
会带来 QMUI 新旧版本兼容问题的更新
- #765 在 4.0.2 版本里由于 QMUI 对以 CocoaPods 方式使用的场景,规定了必须使用
use_frameworks!
,导致某些使用了老旧第三方框架的项目会出错,因此这个版本里我们重新恢复对 static framework 的支持,不管是否添加use_frameworks!
都可以正常使用,这里感谢 0x1306a94 的技术支持。
如何适配新版
- 如果需要,你可以去掉 4.0.2 版本强制在
Podfile
里加上的use_frameworks!
。
Bugfix
- #767 修复当键盘正在显示时发生了
QMUITheme
的切换并修改了keyboardAppearance
,但键盘却没有更新外观的 bug。 - #768 修复 iOS 13 下
QMUIDialogViewController
设置了titleLabelTextColor
后第二次 show 出来时颜色错误的 bug。 - #776 修复使用
OverrideImplementation()
替换了未实现的方法会导致消息转发机制失效的 bug。 - #777 修复
UITextField
聚焦时无法通过setNeedsDisplay
刷新文字颜色的 bug。 - #791 修复开启了手机的”辅助功能-增强对比度“后会出现”-[QMUIThemeColor _highContrastDynamicColor]: unrecognized selector sent to instance“ crash 的 bug。
- 修复
UISearchBar.barTintColor
设置了一个QMUIThemeColor
后当主题变化时无法刷新颜色的 bug。 - 修复当键盘因点击
WKWebView
而降下时,dismiss 事件无法触发QMUIKeyboardManagerDelegate
回调的 bug。 - 修复键盘的
keyboardAppearance
可能与QMUITheme
产生冲突导致主题错乱的 bug。
4.0.2
新增功能
- 新增
UITabBarAppearance (QMUI)
,提供方法qmui_applyItemAppearanceWithBlock:
用于在 iOS 13 下方便地设置UITabBarAppearance
。
会带来 QMUI 新旧版本兼容问题的更新
从 4.0.1 版本开始,QMUI 不再支持以 static framework 方式引入,官网的《开始使用》文档里也已做了相应更新。从 4.0.3 开始重新支持了 static framework,请使用 QMUI 最新版本。QMUIHelper
废弃resourcesBundle
、resourcesBundleWithName:
、imageInBundle:withName:
方法。
如何适配新版
如果你使用 CocoaPods 的方式引入 QMUI,请确保你的 Podfile 里声明了use_frameworks!
。- 全局搜索 “[QMUIHelper resourcesBundle”、“[QMUIHelper resourcesBundleWithName”、“[QMUIHelper imageInBundle”,将使用到的地方删除。
Bugfix
- #736 修复配置表的
TabBarItemImageColor
会覆盖UIImageRenderingModeAlwaysOriginal
的 image 颜色的 bug。 - #737 修复使用自定义返回按钮后,在某些情况下切界面时可以看到按钮跳动的 bug。
- #739 修复
QMUIPopupMenuButtonItem
修改实例的imageMarginRight
无效的 bug。 - #740 修复 iOS 的 bug:在 iOS 13 下通过
UITabBarAppearance
为 tabBarItem 设置字号大于10时,item 的文字会被截断。 - #741 去掉 QMUIKit 里对
UIWebView
的使用。 - #743 修复使用
UISearchController
配合qmui_usedAsTableHeaderView
,在进入搜索时能看到一个黑色遮罩一闪而过的 bug。 - #746 修复以 CocoaPods 方式使用 QMUI,启动时会在 Xcode 控制台输出“[framework] CoreUI: RunTimeThemeRefForBundleIdentifierAndName() couldn't find Assets.car in bundle with identifier: 'QMUI.QMUIResources'”的 log 的问题。
- #751 修复
QMUIDialogViewController.buttonTitleAttributes
指定了颜色,在 dialog hide 后再重新 show 时,按钮的颜色被重置回默认颜色的 bug。 - #754 修复 iPad 下,或 iPhone 横屏时,配置表里
UITabBar
的样式失效的 bug。 - 修复
QMUIThemeImage
在某些情况下可能产生的 crash。 - 修复 present 起来的 viewController 在 QMUITheme 发生变化时无法响应
qmui_themeDidChangeByManager:identifier:theme:
的 bug。 - 修复
QMUIModalPresentationViewController
内部的contentViewController
无法响应qmui_themeDidChangeByManager:identifier:theme:
的 bug。 - 更换
UIView (QMUI).qmui_layoutSubviewsBlock
的实现方式,从而修复以QMUIBadge
的方式显示UITabBar
未读红点时,可能看到未读红点跳动的 bug。
4.0.0
重要说明
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了。
CAShapeLayer
的 fillColor
、strokeColor
,以及 CAGradientLayer
的 colors
,都支持 QMUIThemeColor 了。
对于 QMUIThemeImage,之前我们要求在 provider block 里不要做耗时的操作,现在也不需要担心这个问题,因为 QMUIThemeImage 内部增加了缓存。
新增功能
UINavigationController (QMUI)
增加qmui_isPushing
、qmui_isPopping
、qmui_topViewController
。QMUICommonDefines.h
增加宏QMUIStatusBarStyleDarkContent
用于 iOS 13 下不管当前是 Light/Dark Mode,都希望状态栏显示为黑色文字内容的场景,作为-[UIViewController preferredStatusBarStyle]
的返回值使用。QMUIHelper
增加deviceName
方法用于获取当前设备的产品名称,例如 iPhone 11 Pro Max,而屏幕尺寸判断的系列方法也对2019年9月发布的新设备进行了兼容。QMUINavigationControllerAppearanceDelegate
增加方法navigationBarStyle
用于控制导航栏的 style。UIViewController (QMUI)
增加qmui_animateAlongsideTransition:completion:
用于在转场过程中让一些操作跟随转场动画一起呈现出来。UISearchBar (QMUI)
增加qmui_generateTextFieldBackgroundImageWithColor:
用于生成搜索框内的输入框背景图,增加qmui_generateBackgroundImageWithColor:borderColor:
用于生成搜索框的背景图。- 配置表增加
NavBarShadowImageColor
用于以颜色的方式设置导航栏分隔线。 - 配置表增加
TabBarItemImageColor
用于设置 UITabBarItem 未选中时的图片颜色。 - 配置表增加
TabBarItemImageColorSelected
用于设置 UITabBarItem 选中时的图片颜色。 - 配置表增加
SearchBarTextFieldBackgroundImage
,废弃SearchBarTextFieldBackground
,以支持直接设置一个UIImage
作为搜索框内的输入框背景,通过 iOS 13 的方式指定一个支持 Dark Mode 的 image asset,即可让搜索框里的输入框也支持 Dark Mode。 - 配置表增加
SearchBarBackgroundImage
,废弃SearchBarBottomBorderColor
、SearchBarBarTintColor
,以支持直接设置一个UIImage
作为搜索框的背景图,通过 iOS 13 的方式指定一个支持 Dark Mode 的 image asset,即可让搜索框背景也支持 Dark Mode。
会带来 QMUI 新旧版本兼容问题的更新
QMUINavigationControllerAppearanceDelegate
删除之前已被标记为废弃的方法shouldSetStatusBarStyleLight
。QMUIHelper
删除之前已被标记为废弃的方法renderStatusBarStyleDark
、renderStatusBarStyleLight
。QMUIConfiguration
删除tabBarTintColor
属性,用新增的tabBarItemImageColor
、tabBarItemImageColorSelected
配合之前已有的tabBarItemTitleColor
、tabBarItemTitleColorSelected
来实现对 UITabBarItem 更精准的样式配置。QMUIConfiguration
删除searchBarBottomBorderColor
、searchBarBarTintColor
属性,改为用新增的searchBarBackgroundImage
代替。UISearchBar (QMUI)
里,对于 iOS 11 及以后的系统,搜索框内的输入框背景图的高度从 28 改为 36,以保持与系统默认高度一致,请知悉。- 相册选择控件里,对于“已隐藏”相簿,排序会强制放到相簿列表的最后面。
如何适配新版
- 全局搜索“[QMUIThemeManager sharedInstance]”,将其替换为“QMUIThemeManagerCenter.defaultThemeManager”。
- 全局搜索对
shouldSetStatusBarStyleLight
的使用并将其换成系统的preferredStatusBarStyle
方法。 - 全局搜索 ”[QMUIHelper renderStatusBarStyleDark]“、”[QMUIHelper renderStatusBarStyleLight]“ 并将其删除,改为使用系统的
setNeedsStatusBarAppearanceUpdate
。
如果你有使用配置表
-
增加以下代码到配置表里:
QMUICMI.navBarShadowImageColor = nil; // NavBarShadowImageColor : UINavigationBar.shadowImage 的颜色,如果为 nil,则显示系统默认 shadowImage,如果为全透明,则不显示 shadowImage,如果为除了 nil 和全透明外的其他颜色,则会将这个颜色叠加到 NavBarShadowImage 上显示出来,如果不存在 NavBarShadowImage,则使用一张 1px 高的图片作为默认图。
-
删除
TabBarTintColor
,并增加以下代码:QMUICMI.tabBarItemImageColor = xxx; // TabBarItemImageColor : UITabBarItem 未选中时的图片颜色 QMUICMI.tabBarItemImageColorSelected = xxx; // TabBarItemImageColorSelected : UITabBarItem 选中时的图片颜色
-
删除
SearchBarTextFieldBackground
,改为用新的SearchBarTextFieldBackgroundImage
,如果需要以代码的方式生成输入框的背景图,可使用新增的+ [UISearchBar (QMUI) qmui_generateTextFieldBackgroundImageWithColor:]
。QMUICMI.searchBarTextFieldBackgroundImage = [UISearchBar qmui_generateTextFieldBackgroundImageWithColor:xxx]; // SearchBarTextFieldBackgroundImage : QMUISearchBar 里的文本框的背景图,图片高度会决定输入框的高度
-
删除
SearchBarBottomBorderColor
、SearchBarBarTintColor
,并增加以下代码:QMUICMI.searchBarBackgroundImage = [UISearchBar qmui_generateBackgroundImageWithColor:xxx borderColor:xxx]; // SearchBarBackgroundImage : 搜索框的背景图,如果需要设置底部分隔线的颜色也请绘制到图片里
Bugfix
- #618 修复配置表的
TabBarShadowImage
在 iOS 13 下不生效的 bug,由于这里使用了 iOS 13 新增的UITabBarAppearance
来设置,会导致以前那种设置样式的接口不生效或有问题,这是系统的限制,因此我们在UITabBar (QMUI)
里对旧版本接口做了兼容,如果你在 iOS 13 下使用旧版本的接口,会帮你转换成新版本的接口来使用,请知悉。 - #629 修复某些特定情况下手势返回过程中,上一个界面的 navigationBar 被隐藏的 bug。
- #639 修复
QMUIModalPresentationViewController
以 showInView 的方式显示在 vc.view 上后,如果 push 界面再回来,vc 上的 modal 会消失的 bug。 - #649 修复显示带输入框的
QMUIAlertController
时会提示becomeFirstResponder
错误的 bug。 - #654 修复 push/pop 时
UINavigationBar
返回按钮的文字颜色错误的 bug。 - #659 #701 修复 iOS 13 下
UIMenuController
的windowLevel
变化引发的一系列菜单不可见的问题。 - #663 修复
QMUIMutipleDelegates
无法正确响应conformsToProtocol:
的 bug。 - #679 修复
QMUIPopupContainerView
在UIScrollView
里使用时的布局 bug。 - #680 修复 UIKit 在
UISearchController
显示搜索结果的时候进行 push/pop 操作后可能产生的界面异常的 bug。 - #692 修复 present 一个
QMUINavigationController
时,rootViewController
的navigationBarTintColor
无效的 bug。 - #693 修复 iOS 13.0 把
UIButton
作为UITableViewCell
的accessoryView
使用时会出现布局错误的 bug,iOS 13.1 不会。 - #698 修复
QMUICommonViewController
在调用showEmptyView
之前访问不到self.emptyView
的问题。 - #700 修复存在 present viewController 的情况下 QMUITheme 无法正确更新界面的 bug。
- #715 修复 4.0.0-beta 里对 viewController 横竖屏方向的控制有问题的 bug。
- 修复
DEVICE_WIDTH
、DEVICE_HEIGHT
在某些情况下计算不准确的 bug。 - 修复
QMUICollectionViewPagingLayout
在collectionView.bounces = NO
时会产生滚动异常的 bug。 - 修复 iOS 10、11 下使用
QMUIThemeColor
作为UILabel.attributedText
的 foregroundColor,当主题发生变化时无法正确刷新文字颜色的 bug。 - 修复 iOS 11 及以下使用
QMUIThemeColor
作为UITextView.typingAttributes
的 foregroundColor,当主题发生变化时无法正确刷新文字颜色的 bug。 - 修复使用 Xcode 11 编译到 iOS 9.0 上启动后会因为 Symbol not found: OBJC_CLASS$_PHLivePhotoRequestOptions 而 crash 的系统 bug。
4.0.0-beta
重要说明
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,建议即刻升级到此版本,以减少后期的升级成本。
新增功能
- 适配 iOS 13,#615 列出了目前遇到的所有兼容问题,其中主要的问题是 iOS 13 系统会对某些 KVC 访问抛出异常,针对这个问题,我们提供3种方式解决:
- [推荐] 打开配置表新增的
IgnoreKVCAccessProhibited
,即可全局屏蔽 iOS 13 KVC 异常,适用于大量使用 KVC 的场景,也不需要修改业务代码。 - 使用
NSObject (QMUI)
新增的qmui_valueForKey:
、qmui_setValue:forKey:
代替系统的方法,适用于频次较少的 KVC,也便于通过全局搜索替换的方式来兼容。 - 使用新增的
BeginIgnoreUIKVCAccessProhibited
、EndIgnoreUIKVCAccessProhibited
宏,将有问题的valueForKey:
、setValue:forKey:
包裹起来,从而屏蔽被包裹的代码块可能产生的异常,适用于频次较少的 KVC。
- [推荐] 打开配置表新增的
- 支持 iPad 分屏的适配:
- 增加
QMUIWindowSizeMonitor
用于适配 iPad 分屏下的布局。 QMUIHelper
增加方法applicationSize
(对应宏APPLICATION_WIDTH
、APPLICATION_HEIGHT
)用于获取分屏后的 App 视窗大小,建议不管适不适配 iPad 分屏,都使用这个方法来代替UIScreen.mainScreen.bounds.size
。- 增加宏
IS_SPLIT_SCREEN_IPAD
用于判断当前是否处于分屏。 - 增加宏
IPAD_SIMILAR_SCREEN_WIDTH
用于计算分屏后的尺寸近似于哪个 iPhone 设备的尺寸。 PreferredValue
系列宏在打开了新的配置表项DynamicPreferredValueForIPad
后,支持将分屏后的 iPad 视为某个 iPhone 的设备来布局。
- 增加
- 增加
QMUITheme
组件用于适配 iOS 13 的 Dark Mode,同时也支持 iOS 12 及以下系统的使用,使用文档请查看 Wiki,Demo 请查看 Components->QMUITheme。
- 增加
QMUIAnimation
组件用于实现复杂动画。 QMUINavigationButton
增加adjustsImageTintColorAutomatically
属性便于控制图片和文字都跟随 tintColor 变化。QMUIKeyboardManager
增加ignoreApplicationState
属性用于响应所有UIApplicationState
下的键盘事件,同时解决 #565 提到的问题。QMUIPieProgressView
增加shape
、lineWidth
等属性用于支持新的环状样式。QMUILabel
的highlightedBackgroundColor
属性支持UIAppearance
。UIView (QMUI)
增加qmui_tintColorCustomized
属性用于判断当前 view 是否有设置过自定义的 tintColor。UITableViewCell (QMUI)
增加qmui_selectedBackgroundColor
用于便捷地设置点击高亮时的背景色(否则你需要先初始化一个selectedBackgroundView
。UITableViewCell (QMUI)
增加qmui_styledAsQMUITableViewCell
方法用于按照 QMUI 配置表的样式去配置一个 cell。- 原本属于
UITableView (QMUI)
的属性qmui_initialContentInset
已被迁移到UIScrollView (QMUI)
。 - 增加
UITraitCollection (QMUI)
以在 iOS 13 的 Dark Mode 发生切换前收到通知。 CALayer (QMUI)
增加qmui_isRootLayerOfView
属性用于判断当前的 layer 是否是某个UIView
自带的 layer。CALayer (QMUI)
增加qmui_performWithoutAnimation:
方法用于以无动画的形式修改 layer 属性。NSMethodSignature (QMUI)
增加qmui_avoidExceptionSignature
方法用于生成一个避免 crash 的方法签名。NSString (QMUI)
增加qmui_capitalizedString
用于把首字母转换为大写,系统的capitalizedString
会强制把除首字母外的其他字母转换成小写。NSObject (QMUI)
增加若干方法便于调试时用:qmui_methodList
列出当前对象的所有方法(含继承)。qmui_shortMethodList
列出当前对象的所有方法(不含父类继承)。qmui_ivarList
列出当前对象的所有成员变量。
QMUICommonDefines.h
增加函数setterWithGetter
用于获取给定 getter 对应的 setter。- 配置表增加
KeyboardAppearance
开关用于控制全局输入框默认的键盘样式。 - 配置表增加
NavBarStyle
、TabBarStyle
、ToolBarStyle
用于控制全局的 bar 的样式。 - 配置表增加
UISwitch
相关样式设置,具体请查看下方 如何适配新版。 - 配置表针对 Grouped 类型的
UITableView
增加若干项目,具体请查看下方 如何适配新版。 - 配置表增加
AdjustScrollIndicatorInsetsByContentInsetAdjustment
便于兼容 iOS 13 下新增的-[UIScrollView automaticallyAdjustsScrollIndicatorInsets]
属性。
会带来 QMUI 新旧版本兼容问题的更新
UINavigationControllerBackButtonHandlerProtocol
协议里的shouldHoldBackButtonEvent
、canPopViewController
已被标记为废弃,请使用shouldPopViewControllerByBackButtonOrPopGesture:
代替。QMUIMoreOperationController
的contentEdgeMargin
属性类型从CGFloat
改为UIEdgeInsets
,同时重命名为contentEdgeMargins
,以便于灵活控制面板的布局。QMUITableViewCell
支持样式区分 Plain、Grouped 列表下的样式,因此内部的didInitializeWithStyle:
调用时机发生了变化,导致继承QMUITableViewCell
的子类如果在initWithStyle:reuseIdentifier:
里设置textLabel.textColor
、detailTextLabel.textColor
、self.backgroundColor
,则这些设置将会被 QMUI 默认值覆盖。具体兼容方法请看下方 如何适配新版。
如何适配新版
- 如果遇到 iOS 13 系统对 KVC 抛出的异常,可将配置表的
IgnoreKVCAccessProhibited
置为YES
,或将遇到异常的代码改为用qmui_valueForKey:
、qmui_setValue:forKey:
。 - 全局搜索“shouldHoldBackButtonEvent”、“canPopViewController”,将其改为新的
shouldPopViewControllerByBackButtonOrPopGesture:
。 - 全局以 Matching Word 方式搜索 “contentEdgeMargin”,如果是
QMUIMoreOperationController
的属性,则将其改为contentEdgeMargins
,注意类型从 CGFloat 变为UIEdgeInsets
。 - 检查业务所有继承自
QMUITableViewCell
的类,如果有重写initWithStyle:reuseIdentifier:
,请将该方法删掉,将原本的内容迁移到didInitializeWithStyle:
里。 - 如果有使用配置表,请将以下代码复制到
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
- #632 修复 UIAlertController 在
QMUITabBarController
、QMUINavigationController
内 present 起来时会出现“[UIAlertController supportedInterfaceOrientations] was invoked recursively” 的 log 的 bug。 - #633 修复
NavigationBarHeight
、TabBarHeight
、ToolBarHeight
在某些设备下不准确的 bug。 - #660 修复
QMUIAlertController
的一处内存泄露。 - 修复
QMUINavigationTitleView
在开启了UINavigationBar.prefersLargeTitles
模式的情况下无法与大标题兼容的问题,LargeTitle 的 Demo 请查看 QMUIKit->QMUINavigationController->兼容 LargeTitle。 - 修复 iOS 10 在某些情况下手势返回取消,navigationBar 的按钮将会重叠的 bug。
3.2.1
3.2.0
会带来新旧版本兼容问题的更新
- 重新整理了
NSObject (QMUI) qmui_performSelector:
系列方法,对被调用的 selector 的返回值是对象还是非对象进行接口上的区分,从而避免可能产生的野指针或内存泄露。
如何适配新版
- 全局搜索
qmui_performSelector
,将用到的地方改为新的使用方式,具体使用方式请查看 .h 头文件注释。
Bugfix
- #585 修复
NSObject (QMUI) qmui_performSelector:
系列方法在32位设备(iPhone 5) iOS 10 上获取对象类型的 return 值时会产生野指针的 bug。
3.1.9
3.1.8
新增功能
UIImage (QMUI)
增加qmui_animatedImageNamed:scale:
、qmui_animatedImageNamed:
方法用于读取 gif 文件。- 增加
NSMethodSignature (QMUI)
,允许获取当前方法签名对应的 typeEncoding。 - QMUI Demo 增加 UIImageView (QMUI) 的示例,用于展示
qmui_smoothAnimation
的效果。
Bugfix
- #575 修复 iOS 9 下因 swizzle CALayer init 引发野指针,导致应用启动后 crash 的 bug。
- 修复
OverrideImplementation()
对原本没有该方法的 class 重写方法时会失效的 bug。
3.1.7
重要说明
以前版本的 QMUI 代码里 swizzle 的方案大都是用 QMUIRuntime.h 里的 ExchangeImplementations()
函数,但这种方式在某些情况下会导致代码不以预期方式运行(具体可看下方,或者 #567),因此这个版本里,我们修改了以前的另一个用于 swizzle 的函数 OverrideImplementation()
,以 block 的方式去写 swizzle 后的方法内容,并解决 ExchangeImplementations()
的问题,建议以后默认都用这种方式去 swizzle,不再使用 ExchangeImplementations()
。
对于新方式,被 swizzle 的方法 return 值类型、参数数量及类型都会影响语法,所以我们提供了多个 Code Snippet 简化这个过程,具体可查看 QMUI iOS Code Snippets 里以 extend
和 override
开头的系列,其中 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]
示例:
用 override_void_non_argv
重写 [UIView layoutSubviews]
示例:
会带来 QMUI 新旧版本兼容问题的更新
- 修改
OverrideImplementation
的参数类型,从而避免子类先 swizzle 后父类再 swizzle 同一个方法,会导致子类里丢失父类 swizzle 后的方法内容的问题。
如何适配新版
- 全局搜索
SEL originCMD, IMP originIMP
,将其替换为SEL originCMD, IMP (^originalIMPProvider)(void)
。 - 全局搜索
)originIMP;
,将其替换为)originalIMPProvider();
。 - 以后的 swizzle 需求建议都是用上文提到的
OverrideImplementation()
实现。