如果想看详细的iOS11变动,可转到这篇文章观看。
http://www.jianshu.com/p/342142c25b90
本文是直接写出了iPhoneX的相关适配
1. 首先是判断是否为X
这里我用的方法比较直接,暂时没碰到什么bug,如果各位有更好的方法请指教。
多说一句这里不能用宏定义
或者在Swift中不要写成let dzy_ifX: Bool = Screen_H == 812 ? true : false
这样定义有时候会出问题,大概是因为Screen_H
不同的情况可能会有不同。
let Screen_H = UIScreen.main.bounds.size.height
public var dzy_ifX: Bool {
if Screen_H == 812 {
return true
}else {
return false
}
}
2. UINavigationBar高度的更改
在老代码中,如果是手码编程,相信很多朋友都跟我一样项目里面有很多的64
这个数字,我是使用了一个变量来代替这个64
,在全局找一下所有的64
进行替换
我这个方法并不完善,很明显在我的项目里面,我没有使用到LargeTitle
,如果使用到了LargeTitle
这里就不是88
和64
了,可以自行修改一下。
public var NaviH: CGFloat {
if Screen_H == 812 {
return 88
}else {
return 64
}
}
下面的两张图都是iOS11之后多出一个Largetitle的
image.png
3. UITabbar高度的更改
在iPhoneX中,UITabBar的高度示意图如下。
其他的手机中,
Tabbar
的高度为49
,在iPhoneX中,多了一个圆角矩形区域,高度为34
。image.png
我所有界面的适配就是按着这个
TabBar
的样式来进行适配的。在ViewController
中把最下面留出了一个34
image.png
当然了,你也可以根据页面的具体情况来衡量用不用留这个
34
我在所有需要空出这个高度的地方,计算高度的时候都加了一个自定义的变量,如下所示。
public var TabRH: CGFloat {
if Screen_H == 812 {
return 34
}else {
return 0
}
}
4. automaticallyAdjustsScrollViewInsets属性的弃用
在iOS11中,该属性已经被弃用,如果有地方用到了这个,需要进行更改。
不过该属性是UIViewController的 而替代的contentInsetAdjustmentBehavior属性为UIScrollView的。
具体怎么修改可以自行考虑。
我只是简单的给UIViewController做了一个扩展,添加了如下方法。
func dzy_adjustsScrollViewInsets(_ scrollView: UIScrollView? = nil) {
if #available(iOS 11.0, *) {
if let scrollView = scrollView {
scrollView.contentInsetAdjustmentBehavior = .never
}
} else {
automaticallyAdjustsScrollViewInsets = false
}
}
5. 友情提示,iOS11以后界面中间的线不要使用CollectionView的背景色加间隔来做。
比如我这里,我是用了0.5
的间隔加灰色背景做的间隔,就会出现类似下图的问题。
然后我用白色背景,自己在每个cell
里面加0.5
宽度的线依旧会有这类问题。
大概的原因是cell
的frame
不是一个整数导致的。像这种一行4个cell
,cell
的宽度根据屏幕宽来计算的,不是整数很正常。
在iOS11之前,也会偶尔有类似的问题,比如你可以去搜一下,iOS UILabel字体模糊
,这种关键字的文章,讲的也都是一个问题。但是在iOS11之后这个问题变得更明显的,我感受最明显的就是UICollectionView
中用间隔和背景色划线的方式。
这种问题我所知道的最简单的处理方式是,用系统自带的数学函数,把你的View
或者Cell
的frmae
修改成整数的。类似下面这样,我使用的是floor
函数 :
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
switch indexPath.section {
case 0:
return CGSize(width: Screen_W, height: UI_H(150))
case 3:
return CGSize(width: Screen_W, height: UI_H(85))
default:
return CGSize(width: floor(Screen_W / 4.0), height: floor(UI_H(75)))
}
}
如果你对各种数学函数有兴趣,可以跳转我的另一篇文章
http://www.jianshu.com/p/822e720bbc8e
网友评论