今天升级xcode 9, 试了试iPhone X, 结果没有看到我预期的全屏效果,上下都没有显示全.
思忖片刻后想起我的启动图用的是LaunchImage, 而且只有四套, 没有5.8寸的,
注:如果用的是LaunchScreen.storyboard, 是不会因为缺少某个尺寸的启动图而显示不对的
然后我便生成了一张1125 × 2436 的启动图,
但是不知道为何, 我的LaunchImag里面没有添加5.8寸的图片的位置,既然不能拖, 只好来硬的了,show in finder 直接把图片弄在LaunchImage文件下,并在Contents.json中images中添加
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "2436h",
"filename" : "[email protected]",
"minimum-system-version" : "11.0",
"orientation" : "portrait",
"scale" : "3x"
},
filename 取决于你自己起什么名了
然后再启动就OK了, 打印的屏幕大小为 375x812;
自动布局时需要注意一下几点
1. iOS11 以前,我们布局时,视图的 top和 bottom一般参照的是 Top Layout Guide 和 Bottom Layout Guide
2. iOS11 以后,那两个参照已经 deprecated (过时)了,而被 Safe Area 取
3. Safe Area 要求最低支持 iOS9.0
顶部导航栏的高度是44+44, 底部有34的触摸区域, 效果如下
适配的话无非是处理一下顶部导航栏和底部触摸区域,自己写个宏就可以搞定。每次设置高度View高度都使用宏,省的每次判断。对于有tabbar的页面,高度在ContentHeight的基础上再减去49就行。
#define iphoneX ([UIScreen mainScreen].bounds.size.height>800.0f)
#define kNavigationHeight (iphoneX ? 88.0 : 64.0)
#define kBottomBarHeight (iphoneX ? 34.0 : 0)
#define kContentHeight (kScreenHeight - kNavigationHeight-kBottomBarHeight)
对于底部, 主要是处理一下ScrollView ,iOS 11引入了contentInsetAdjustmentBehavior这个属性,我英文不好,就不翻译了
typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
UIScrollViewContentInsetAdjustmentAutomatic, // Similar to .scrollableAxes, but for backward compatibility will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewInsets = YES inside a navigation controller, regardless of whether the scroll view is scrollable
UIScrollViewContentInsetAdjustmentScrollableAxes, // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted
UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
} API_AVAILABLE(ios(11.0),tvos(11.0));
使用的时候根据需求设置枚举值就行
我自己是这么用的,不使用自动适配, 每个页面的tableView/scrollView高度都用自己定义的宏
if (@available(iOS 11.0, *)) {
[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
注意: 即使某些页面单独做了处理, 下面这种做法也是坚决不可以的, 因为他设置的全局的样式, 所有的scrollView及其子类都会生效,我之前就这么干的, 结果iPhone X上, 输入框在输入状态的下看不大输入的文字, 看了一下图层结构才知道, 输入框在输入时上面有个子控件叫做UIFieldEditor, 他是继承自UIScrollView的, 所以他的contentInset.bottom是34,导致文字显示不出来
// iOS 11
if (@available(iOS 11.0, *)) {
[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
// iPhone X 千万不要这么干
if (iphoneX) {
UIEdgeInsets inset = [UIScrollView appearance].contentInset;
inset.bottom += 34;
[UIScrollView appearance].contentInset = inset;
}