iPhone X 屏幕适配

今天升级xcode 9, 试了试iPhone X, 结果没有看到我预期的全屏效果,上下都没有显示全.

思忖片刻后想起我的启动图用的是LaunchImage, 而且只有四套, 没有5.8寸的,iPhone X 屏幕适配_第1张图片

注:如果用的是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的触摸区域, 效果如下

iPhone X 屏幕适配_第2张图片

适配的话无非是处理一下顶部导航栏和底部触摸区域,自己写个宏就可以搞定。每次设置高度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;
}




你可能感兴趣的:(学习笔记)