适配iPhone X UITabBar及UITableView偏移的情况

Xcode Release版本出来了,iPhone的适配也在悄然进行中。此篇文章就此针对iPhone X的UITabBar做适配。

UITabBar 偏移问题

当在push到下一界面时,并设置hidesBottomBarWhenPushedYES将会出现Figure-1的情况 -- UITabBar向上偏移34pt即蓝色区域。下面提供一个safeAreaInsets变化的过程:

deltaVaue = 83 - 49 = 34

2017-09-21 15:32:50.063642+0800 ios11NavBar[3698:126162] viewSafeAreaInsetsDidChange:{44, 0, 83, 0}
2017-09-21 15:32:50.070815+0800 ios11NavBar[3698:126162] DidLayout-containerView: {{0, 0}, {375, 812}}
2017-09-21 15:32:56.447208+0800 ios11NavBar[3698:126162] viewSafeAreaInsetsDidChange:{44, 0, 49, 0}
2017-09-21 15:32:56.447649+0800 ios11NavBar[3698:126162] DidLayout-containerView: {{0, 0}, {375, 778}}
2017-09-21 15:32:56.448666+0800 ios11NavBar[3698:126162] viewSafeAreaInsetsDidChange:{44, 0, 83, 0}
2017-09-21 15:32:56.448890+0800 ios11NavBar[3698:126162] DidLayout-containerView: {{0, 0}, {375, 812}}

适配iPhone X UITabBar及UITableView偏移的情况_第1张图片
Figure-1

解决方案

继承UITabBarController,修改UITabBarY坐标值。不是最优方案,如果有较好的方案希望大家能不啬指点一二。

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    //TODO: adapt tabbar's y value.
    if ([RTDeviceHardware iPhoneXDevice]) {
        CGFloat deltaTabBarY = SCREEN_HEIGHT - CGRectGetHeight(self.tabBar.frame);
        self.tabBar.frame = (CGRect){0, deltaTabBarY, self.tabBar.bounds.size};
    }
}

最终效果如图

适配iPhone X UITabBar及UITableView偏移的情况_第2张图片
Figure-2

UITableView 刷新后偏移问题

在iOS11上,设置UITableViewstyleUITableViewStyleGrouped时,并且行高大于220(囧 项目中有类似问题,又经过反复验证我就大胆预估了一个值,220就由此得来),当push再pop回来刷新列表 就会导致列表偏移,并没有停留在之前的位置。

适配iPhone X UITabBar及UITableView偏移的情况_第3张图片
Figure-3

解决方案

//TODO: iOS 11之后,预估值有默认高度,如果不需要就设置0
 _tableView.estimatedRowHeight = 0;//这里需要吐槽下,如果不设置为0 就会出现刷新后偏移问题。        
 _tableView.estimatedSectionHeaderHeight = 0;        
 _tableView.estimatedSectionFooterHeight = 0;

Demo

你可能感兴趣的:(适配iPhone X UITabBar及UITableView偏移的情况)