2.1.0
本次版本更新的主要内容是适配 iOS 11,由于距离上个版本已有一个月之久,因此本次版本更新内容较多,请耐心看完。如果想直接查看本次 QMUI 更新要做的兼容修改,请直接跳到文章尾部的 更新指南。
更新点(按模块列出)
AssetLibrary
- 相册控件
QMUIAsset
增加判断系统新增的HEIC
格式资源的方式。 - 相册控件支持展示 GIF。
- 优化相册控件的默认样式,对齐 iOS 11 系统风格。
QMUIAlertController
QMUIAlertController
增加addCancelAction
方法用于便捷地添加一个取消按钮。QMUIAlertController
增加isExtendBottomLayout
属性用于控制是否需要在 iPhone X 上自动延伸底部的背景色,如果你的 alertController 样式是撑满屏幕宽度的,则建议使用这个属性,如果是类似系统那种悬浮不贴边的,则不需要。
QMUIButton
- 修复
QMUIButton
使用了adjustsImageTintColorAutomatically
之后修改tintColor
,再设置不同的UIControlStateNormal
image,会导致 highlighted 时又看到旧的UIControlStateNormal
image。 - 修复当使用 xib / storyboard 时,
QMUIButton
和QMUILabel
的大小展示错误的 bug(详见 #228)。 - 将
UIButton (QMUI)
的initWithImage:title:
方法重命名为更标准的qmui_initWithImage:title:
。
QMUIModalPresentationViewController
- 增加方法
updateLayout
用于手动触发 modalPresentationViewController 去更新浮层的布局。 - 增加 3 个属性
shownInWindowMode
、shownInPresentedMode
、shownInSubviewMode
用于区分当前是以哪种方式显示的。 UIViewController (QMUIModalPresentationViewController). modalPresentedViewController
重命名为更符合规范的qmui_modalPresentationViewController
。
QMUIMoreOperationController
QMUIMoreOperationController
在本次版本进行了重构,改动较大,请到 Wiki 查看详细修改及适配方法。
QMUINavigationTitleView
- 修复
QMUINavigationTitleView
在做accessoryView
动画的过程中修改 title 文字时,布局无法被刷新的问题。
QMUIPopupContainerView
- 增加
willShowBlock
用于在即将显示浮层时做一些事情。 willHideBlock
增加参数animated
用于区分是否以动画的方式隐藏。
QMUITextView
QMUITextView
增加canPerformPasteActionBlock
和pasteBlock
用于实现自定义的粘贴行为。
QMUICommonDefines
- 将宏
IOS_VERSION
的数据类型从floatValue
改为doubleValue
,避免一些数据类型不匹配导致的运算错误。 - 增加打不同级别的 log 的宏
QMUILogInfo
、QMUILogWarn
,可通过配置表里的对应开关来控制某个级别的 log 是否要输出。
QMUIHelper
- 增加
QMUIHelper (SystemVersion)
用于精准判断不同的系统版本之间的高低,之前用宏IOS_VERSION
的方式无法区分 “10.3.1” 和 “10.3.2” 的大小。 QMUIHelper (DynamicType)
增加方法+ safeAreaInsetsForIPhoneX
用于获取 iPhone X 新增的那些安全区域的值。
NSArray (QMUI)
- 增加
qmui_enumerateNestedArrayWithBlock:
用于将多维数组打平成一维数组遍历。
NSString (QMUI)
- 废弃
qmui_includesString:
方法,请使用 iOS 8 系统自带的containsString:
代替。 - 修复
qmui_lengthWhenCountingNonASCIICharacterAsTwo
在小字节序端下对一些字符的长度判断不准确的bug(详见 #245)。
UIScrollView (QMUI)
- 增加属性
qmui_contentInset
用于兼容不同版本的contentInset
、adjustedContentInset
的使用。
UISearchBar (QMUI)
由于 iOS 11 新增了以 navigationItem.searchController
方式使用 UISearchBar
的途径,所以导致原本以 tableHeaderView = searchBar
方式使用的情况下,搜索框的样式会有较多问题,因此这个版本里做了较多兼容适配(详见 #233)。
- 增加属性
qmui_usedAsTableHeaderView
给业务告诉 QMUI 当前的使用方式是否是tableHeaderView
,仅在该值为YES
的情况下才会自动做兼容。 - 增加属性
qmui_textFieldMargins
用于在系统的布局结果上调整输入框的布局。 - 增加属性
qmui_cancelButton
用于获取搜索框里的取消按钮。 - 增加属性
qmui_segmentedControl
用于获取 scopeBar 里的UISegmentedControl
。
UITabBar (QMUI)
- 修复 iOS 11.2 以前的版本在界面 push 时,tabBar 会跳动的问题(详见 #217)。
- 修复 iOS 11 里
UITabBar
在某些情况下无法让UIScrollView
自动调整contentInset.bottom
的问题(详见 #218)。
UITableView
- 配置表增加开关
tableViewEstimatedHeightEnabled
用于控制全局的 UITableView 默认是否要启用estimatedHeight
功能(iOS 11 下,UIKit 默认会打开它,但会影响很多其他功能的使用,例如contentOffset
、contentSize
的计算等,所以增加一个开关方便全局关闭掉)。 UITableView (QMUI)
增加属性qmui_indexForVisibleSectionHeaders
用于获取可视范围内的 sectionHeader。UITableView (QMUI)
增加属性qmui_indexOfPinnedSectionHeader
用于获取当前正处于停靠状态的 sectionHeader 的 index。UITableView (QMUI)
增加方法qmui_isHeaderPinnedForSection:
用于判断指定的 sectionHeader 是否处于停靠状态。- 修复在 iPhone X 横屏下使用
QMUICellHeightCache
提供的 cell 高度计算和缓存功能时,由于无法感知到列表safeAreaInsets
的变化导致高度计算错误的问题。
UIView (QMUI)
- 增加属性
qmui_safeAreaInsets
用于兼容不同 iOS 版本下对safeAreaInsets
的调用。 - 在调用
convertPoint
、convertRect
系列方法时,对转换坐标的两个 view 是否存在共同父 view 做检测,如果不存在则打印 log 提醒(详见 #230)。
更新指南
配置表
如果有使用配置表,请打开业务项目的 QMUIConfigurationTemplate.m
,执行以下修改:
- 增加开关
tableViewEstimatedHeightEnabled
用于控制UITableView
的estimatedHeight
特性,默认值为YES
。 - 增加
QMUILog
的 3 个开关:shouldPrintDefaultLog
、shouldPrintInfoLog
、shouldPrintWarnLog
,用于控制 QMUI 内部不同级别的 log 是否要输出,默认值为YES
。 - 增加
shouldFixTabBarTransitionBugInIPhoneX
用于自动修复 iOS 11.2 以前的系统 bug(详见 #217),默认值为NO
。
你也可以直接复制以下代码到你的配置表里。
QMUICMI.tableViewEstimatedHeightEnabled = YES; // TableViewEstimatedHeightEnabled : 是否要开启全局 UITableView 的 estimatedRow(Section/Footer)Height
QMUICMI.shouldPrintDefaultLog = YES; // ShouldPrintDefaultLog : 是否允许输出 QMUILogLevelDefault 级别的 log
QMUICMI.shouldPrintInfoLog = YES; // ShouldPrintInfoLog : 是否允许输出 QMUILogLevelInfo 级别的 log
QMUICMI.shouldPrintWarnLog = YES; // ShouldPrintInfoLog : 是否允许输出 QMUILogLevelWarn 级别的 log
QMUICMI.shouldFixTabBarTransitionBugInIPhoneX = NO; // ShouldFixTabBarTransitionBugInIPhoneX : 是否需要自动修复 iOS 11 下,iPhone X 的设备在 push 界面时,tabBar 会瞬间往上跳的 bug
QMUIMoreOperationController
本次更新重构了这个控件,适配指南请查看 Wiki。
其他
- 全局搜索
.modalPresentedViewController
,将其重命名为.qmui_modalPresentationViewController
。 - 为所有
QMUIPopupContainerView.willHideBlock
增加第二个参数BOOL animated
。 - 将所有用到
UIButton (QMUI) initWithImage:title:
方法重命名为qmui_initWithImage:title:
。 - 全局搜索
qmui_includesString:
,将其替换为containsString:
。