与iPhoneX的适配小记
这几天加班加点的把公司的app都完成了ios11和iphoneX的适配,总算是松了一口气,在这里做一个小记录
1.Xcode9下相册等访问权限问题
新的xcode9替换了相册的权限key,由原来的 NSPhotoLibraryUsageDescription替换成了NSPhotoLibraryAddUsageDescription,在用xcode9打包的时候不提换会导致crash
2.导航栏TitileView的宽度设置
导航栏在iOS10之前都是默认的64p,但是,到了iOS11就不单单是64p了,可以看一下系统的信息App,在iOS11添加了大标题,而且iOS11之前导航栏的title是添加在UINavigationItemView上面,而navigationBarButton则直接添加在navigationBar上面;如果设置了titleView,则titleView也是直接添加在navigationBar上面
968977-c6fe6299a9fedd8b.png
在iOS11之后,苹果添加了新的类来管理,navigationBar会添加在_UIButtonBarStackView上面,而_UIButtonBarStackView则添加在_UINavigationBarContentView上面;如果没有给titleView赋值,则titleView会直接添加在_UINavigationBarContentView上面,如果赋值给了titleView,则会新生成_UITAMICAdaptorView,把titleView添加在这个类上面,这个类会添加在_UINavigationBarContentView上面,所以之前的titleView的约束全部要重新写一个ios11的约束,至于自带的naviSearch和largeTitle因为时间有限没有去研究过,反正暂时还用不到
3.Safe Area
这个是最让我头疼的地方,因为iphoneX的缘故,底部的一片区域可能要用来做上拉返回Home的操作,为了防止布局到那里形成了手势冲突,在ios11里就加上了Safe Area的概念,这个概念刚开始看文档没看懂什么意思,后来自己试着写了个demo就理解了
2017-09-16-003.png 2017-09-16-004.png黄色的部分就是苹果认为不会引发误操作的区域,所以在ios11里布局的layout有了一个新的约束参照就是Safe Area,那我们之前的布局因为会导致"探底"所以要做修改
如果是用xib完成的约束,只要在右边菜单栏选中Use Safe Area Layout Guides
就会看到xib里有一个Safe Area的约束参照
2017-09-16-005.png
那么要做的就是把原先的bottom和top约束从相对于superView改成相对于Safe Area就可以了
如果是用的代码进行的约束,就要改一下约束的写法,下面是个小例子
private let greenView = UIView()
private func setupView() {
greenView.translatesAutoresizingMaskIntoConstraints = false
greenView.backgroundColor = .green
view.addSubview(greenView)
let margins = view.layoutMarginsGuide
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),
greenView.bottomAnchor.constraint(equalTo: margins.bottomAnchor)
])
}
上面的代码是相对于原先的view进行约束,效果如下
2017-09-17-001.pngif #available(iOS 11, *) {
let guide = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0)
])
}
上面的代码则是选择用safeArea进行约束,效果如下
2017-09-17-002.png那如果是像我一样之前用的masnory的,只要把block里面和top,bottom有关的删除掉,在下面模仿上面的样式加上相关约束就可以了
------------------更新----------------------
最新的masnory已可以支持safeArea
4.UITableView
UIScrollView相关的东西一起记在这里,都是相同的问题。
首先是automaticallyAdjustsScrollViewInsets这个属性被废弃了,之前如果设置automaticallyAdjustsScrollViewInsets=NO,就不会偏移64p,在ios11里要用新的属性来设置
if #available(iOS 11.0, *) {
tableView.contentInsetAdjustmentBehavior = .never
}
然后ios11里默认启用Self-Sizing,tableView不会一次性计算所有的cell的高度了,只会计算当前屏幕能够显示的cell个数再加上几个,滑动时,tableView不停地得到新的cell,更新自己的contenSize,在滑到最后的时候,会得到正确的contenSize,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension,如果不想开启的话可以用下面的方法关闭
tableView.estimatedRowHeight = 0;
tableView.estimatedSectionHeaderHeight = 0;
tableView.estimatedSectionFooterHeight = 0;
5.iphoneX全屏显示
这个只要添加一个尺寸为1125 × 2436的启动图就可以了,在Contents.json里加上
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "2436h",
"filename" : "IOS开机X.png",
"minimum-system-version" : "11.0",
"orientation" : "portrait",
"scale" : "3x"
}
6.IQKeyBoardManager不显示Done按钮的问题
目前这个问题还没有解决,看了下作者的github都快几个月没更新了,但是有没有什么更好的解决方案,现在暂时用的替代方案是点击空白处让键盘消失的方法,如果有什么更好的解决方案请留言告诉我,多谢
------------------更新----------------------
最新的IQKeyBoardManager已解决这个问题