iOS11屏幕适配(iphone X、tableView内容下移)

这里总结了大家iOS 11,iPhone X 适配问题
上面的已经介绍很全了,但我还是记下我遇到的问题。

1、iphone X上下缺失
2、tableView内容下移

1、iphone X上下缺失

更新了Xcode之后,用iphone X模拟器跑了一下项目,结果发现是这样子的:

异常界面

上下明显缺了一截,没有刘海的效果。控制台还会打印警告信息:

2017-09-21 16:36:45.134930+0800 JDYL[8974:802278] +[CATransaction synchronize] called within transaction
2017-09-21 16:36:45.434824+0800 JDYL[8974:802278] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    ,
    ,
    ,
    ,
    ,
)


Will attempt to recover by breaking constraint 


Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in  may also be helpful.

解决办法:

寻找了好久,发现是LaunchImage里没有适配iphoneX屏幕的图片导致的。
所以赶快制作个适配iPhone X的启动图片吧

正确的界面

其他需要注意的地方请看这里:iPhone X 苹果官方人机交互指南 手动翻译


2、tableView内容下移

所有的机型中都发现tableView下移了20pt

异常界面

原因是iOS 11中Controller的automaticallyAdjustsScrollViewInsets属性被废弃了,系统自动加上了20pt或者64pt的边缘距离。

解决办法:

加上这句代码,不需要系统为你设置边缘距离:

// tableView 偏移20/64适配
if (@available(iOS 11.0, *)) {
    self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;//UIScrollView也适用
}else {
    self.automaticallyAdjustsScrollViewInsets = NO;
}


// tableView 如果是Gruop类型的话,section之间的间距变宽,执行返回高度的同时还需要执行return UIView的代理
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 10;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return 0.1;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    return [[UIView alloc] init];
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] init];
}

可以写两个宏:

#define AdjustsScrollViewInsetNever(controller, view) if(@available(iOS 11.0, *)) {view.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;} else if([controller isKindOfClass:[UIViewController class]]) {controller.automaticallyAdjustsScrollViewInsets = false;}

#define UITableViewEstimatedHeight(tableView) \
    if (@available(iOS 11.0, *)) { \
        tableView.estimatedRowHeight = 0; \
        tableView.estimatedSectionHeaderHeight = 0; \
        tableView.estimatedSectionFooterHeight = 0; \
    }

其他具体的内容看这里:iOS 11 安全区域适配总结

你可能感兴趣的:(iOS11屏幕适配(iphone X、tableView内容下移))