1. 在使用automaticDimension
自动计算高度时,要注意,因为iOS11之前是默认关闭Self-Sizing,而iOS11后默认开启Self-Sizing,所以在iOS11之前是需要设置预估高度来自动计算高度。
tableView.rowHeight = UITableView.automaticDimension
//先关闭预估高度,防止MJRefresh,上拉加载时异常跳动,因为开启Self-Sizing之后,tableView使用了estimateRowHeight属性,这样就会造成contentSize和contentOffset值的变化,而MJRefresh正是监听了contentOffset的变化,所以会造成在iOS11及以后,使用预估高度后,MJRefresh在上拉加载的时候回异常跳动。
tableView.estimatedRowHeight = 0
tableView.estimatedSectionHeaderHeight = 0
tableView.estimatedSectionFooterHeight = 0
//在使用回调设置预估高度,防止iOS10的时候显示异常
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 44
}
10异常,12正常.jpeg
总结 : 使用automaticDimension
时,为了适配iOS9、iOS10、iOS11、iOS12等系统,同时为了防止出现MJRefresh的bug,所以我建议先设置estimated属性为0,然后在代理回调中返回预估高度。`
2. 在使用安全区域时,iOS10和iOS12有所差异:
例如:设置控件距离顶部安全区域的约束为0,
在iOS10中,控件的Y坐标为0
在iOS12中,控件的Y坐标为20/64
10异常,12正常.jpeg
总结:为了适配多系统,最好不要使用安全区域来控制顶部距离;
想控制顶部的距离,可以先设置一个距离顶部的约束,然后根据机型的不同,调整约束为导航栏的高度
3. 使用UIScrollView及其子类的时候,要注意iOS10系统和iOS12之间的差异:
`如果不加下面代码,在iOS10就会出现异常布局`
if #available(iOS 11.0, *) {
imageCollectionView.contentInsetAdjustmentBehavior = .never
} else {
self.automaticallyAdjustsScrollViewInsets = false
}
10异常,12正常.jpeg
总结:当界面中有ScrollView及其子类的时候,最好将
automaticallyAdjustsScrollViewInsets
手动赋值,以避免不同系统带来的差异