iOS 11/iPhone X适配之statusBar获取网络类型 & 安全区域适配无效果

1、使用“statusBar”获取网络类型:

注明:此bug不是iOS11的bug,而是iPhone X的,估计是因为那恶心的刘海引起的。。。

之前通过“ statusBar”获取网络类型时大家应该都是这样写的

    UIApplication *app = [UIApplication sharedApplication];
    NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];

现在iPhone X中这个statusBar的属性层级结构发生了变化,直接多了一层,因而产生崩溃,层级结构如下图:


iOS 11/iPhone X适配之statusBar获取网络类型 & 安全区域适配无效果_第1张图片
statusBar层级结构

所以现在需要适配如下:

    UIApplication *app = [UIApplication sharedApplication];
    NSArray *subviews = nil;
    if (ScreenHeight == 812) {
        subviews = [[[[app valueForKey:@"statusBar"] valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
    } else {
        subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
    }

2、安全区域适配(为啥别人都适配好了你没效果)

由于安全区域导致部分导航栏隐藏并且带scrollview(tableview、collectionview)的界面顶部有留白,关于安全区域可以参考下面文章:

iOS 11 安全区域适配总结

适配代码如下。不知道有没有兄弟和我一样,因为automaticallyAdjustsScrollViewInsets是控制器的属性,原来我写在控制器加载完毕一开始的位置,在tableview生成之前,结果自然就没有效果了,自己纠结了好久。。。

if (@available(iOS 11.0, *)) {
    self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
    self.automaticallyAdjustsScrollViewInsets = NO;
}

3、UIBarButtonItem自定义view的frame设置无效,必须autolayout

原先下面的customView用frame写好了大小结果到iOS11里无效了,必须用autolayout再设置一遍大小,我是用的masonry

        [_scancodeCell mas_makeConstraints:^(MASConstraintMaker *make) {
            make.size.mas_equalTo(CGSizeMake(barCellSize.width, barCellSize.height));
        }];
        [[UIBarButtonItem alloc]initWithCustomView:customView]

你可能感兴趣的:(iOS 11/iPhone X适配之statusBar获取网络类型 & 安全区域适配无效果)