美文网首页iOS学习笔记iOS 实用技术iOS
App界面适配iOS11(包括iPhoneX的奇葩尺寸)

App界面适配iOS11(包括iPhoneX的奇葩尺寸)

作者: 一剑孤城 | 来源:发表于2017-08-15 11:15 被阅读88362次

公司的App是居于iOS8以上的,页面显示在iOS8~iOS10都没有问题,但是,iOS11beta版显示出现各种问题,真是顾客虐你千百遍,你待顾客如初恋,苹果搞事,我们也只能暗暗的承受。😜

搞事一:导航栏

1.导航栏高度变化

导航栏在iOS10之前都是默认的64p,但是,到了iOS10就不单单是64p了,可以看一下系统的信息App,在iOS11添加了大标题,效果如下图1:


图1.png

navigationBar的结构,看图2、3、4:


图2.png 图3.png 图4.png

在上面三幅图可以知道,在iOS11导航栏多了一个LargeTitleView,专门显示大字标题用的,整个导航栏的高度达到了96p,这不包括状态栏的高度,也就是说,整个app顶部高度达到了116p,其中statusbar=20,title=44,largetitle=52,不过默认是64p;当然,iPhoneX的高度会更高点,如果不显示大字标题,顶部的高度也达到了88,statusbar=44,title=44,如果显示大字标题,则高度变成了140,statusbar=44,title=44,largetitle=52,也就是说,iPhoneX的刘海高度为24p,大字标题如下图:

iPhoneX之前的机型.png iPhoneX.png

2.导航栏的图层变化

iOS11之前导航栏的title是添加在UINavigationItemView上面,而navigationBarButton则直接添加在navigationBar上面;如果设置了titleView,则titleView也是直接添加在navigationBar上面,如图5:

图5.png

在iOS11之后,苹果添加了新的类来管理,navigationBar会添加在_UIButtonBarStackView上面,而_UIButtonBarStackView则添加在_UINavigationBarContentView上面;如果没有给titleView赋值,则titleView会直接添加在_UINavigationBarContentView上面,如果赋值给了titleView,则会新生成_UITAMICAdaptorView,把titleView添加在这个类上面,这个类会添加在_UINavigationBarContentView上面,如下图6、7:

图6.png 图7.png

3.导航栏的边距变化

在iOS11对导航栏里面的item的边距也做了调整:

(1)如果只是设置了titleView,没有设置barbutton,把titleview的宽度设置为屏幕宽度,则titleview距离屏幕的边距,iOS11之前,在iPhone6p上是20p,在iPhone6p之前是16p;iOS11之后,在iPhone6p上是12p,在iPhone6p之前是8p。
(2)如果只是设置了barbutton,没有设置titleview,则在iOS11里,barButton距离屏幕的边距是20p和16p;在iOS11之前,barButton距离屏幕的边距也是20p和16p。
(3)如果同时设置了titleView和barButton,则在iOS11之前,titleview和barbutton之间的间距是6p,在iOS11上titleview和barbutton之间无间距,如下图8、9:
图8.png 图9.png

4.App需要实现导航栏左右按钮边距为0

在iOS11之前,可以设置一个width为负的navigationBarButton,将按钮挤到边缘,变相实现0边距的导航栏按钮,但是,这招在iOS11失效了,原因在于_UIButtonBarStackView,这个iOS9之后出来的,用来相对布局的组件,限制了子view的布局。那怎么搞呢?

想到的方法有几个:
(1)在viewWillAppear里面,将_UIButtonBarStackView取出来,直接设置它的x坐标。
(2)设置titleView,然后将button添加在titleView上面,根据不同的边距做偏移。

方法一:
遇到的问题,在viewDidLoad,viewWillAppear,viewWillLayoutSubviews,viewDidLayoutSubviews里面都取不到_UIButtonBarStackView,只有在viewDidAppear里才能取到值,这样就会在页面显示了之后才开始移动navigationBarButton,显然这样体验不好,所以,暂时pass掉。

方法二:
这个做法完全可以做到0边距,但是,问题来了,就是点击区域的问题。因为左右navigationBarButton的点击区域是超出父view的,所以,点击不到。这好办,重写titleView的hitTest方法就好。嘿嘿嘿,问题没有那么简单。之前在iOS11的图层结构就解释过,titleView会被添加在_UITAMICAdaptorView上面,而重点是,这个view也有边距,所以,单单重写titleView的hitTest方法还不够,那怎么解决呢?我的办法就是写一个view的类别,hook所有view的hitTest方法,在里面判断是否是iOS11以上,是否是_UITAMICAdaptorView类,如果都满足条件,则可以搞事了。😜Demo

搞事二:列表的变化

1.automaticallyAdjustsScrollViewInsets

在iOS11之前,如果想要scrollView不偏移64p,则需设置automaticallyAdjustsScrollViewInsets=NO,但是这个属性在iOS11直接被遗弃了😳:

@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets
API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0));

所以,看一下contentInsetAdjustmentBehavior是何方神圣:

typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
    UIScrollViewContentInsetAdjustmentAutomatic, // Similar to .scrollableAxes, but will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewContentInset = 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));

/* Configure the behavior of adjustedContentInset.
 Default is UIScrollViewContentInsetAdjustmentAutomatic.
 */
@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0),tvos(11.0));

看起来这和iOS11搞的safeArea有关,这个先放一遍,看看怎么适配:

#define  adjustsScrollViewInsets_NO(scrollView,vc)\
do { \
    _Pragma("clang diagnostic push") \
    _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
        if ([UIScrollView instancesRespondToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
            [scrollView   performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)];\
        } else {\
            vc.automaticallyAdjustsScrollViewInsets = NO;\
        }\
    _Pragma("clang diagnostic pop") \
} while (0)

上面是公司里面一个大神写的,这样就可以在Xcode8上面跑了。

2.tableView默认使用Self-Sizing

这个配合estimatedRowHeight、estimatedSectionFooterHeight、estimatedSectionHeaderHeight使用,可以预估高度。之前,设置header或者footer高度为0时,需要设置height=0.1,才会起作用,如果直接设置为0,则会使用默认高度。iOS11由于自动使用预估高度,所以,忽略了设置的高度,使原来的高度增大了。只要把这几个属性设置为0就可以解决。

搞事三:iPhoneX底部tabbar的高度改变

iPhoneX不止多了刘海,底部还有一个半角的矩形,使得tabbar多出来了34p的高度,不过不管导航栏和tabbar一般系统都会自动适配safeArea。

iPhoneX tabbar.png

搞事四:iOS11 iPhoneX页面push时tabbar位置变化

直接上图:


iOS11 iPhoneX Tabbar.gif

可以看到在页面push的时候,tabbar的frame上移了,这个只有在iPhoneX上面才能看到(因为iPhoneX的TabBar的高度不一样),有可能是模拟器的bug,但是,具体要到真机出来才知道。下面说说修复的几种办法:

(1)将导航栏的代理设置为当前的controller,然后在将要展示下个页面的方法里修正TabBar的frame。
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (![[[UIDevice currentDevice] modelName] isEqualToString: @"iPhone X"]) {
        return;
    }
    CGRect frame = self.tabBarController.tabBar.frame;
    if (frame.origin.y < ([UIScreen mainScreen].bounds.size.height - 83)) {
        frame.origin.y = [UIScreen mainScreen].bounds.size.height - 83;
        self.tabBarController.tabBar.frame = frame;
    }
}
(2)新建一个类,继承UITabBar,然后在setFrame:里面做判断修正,将改类替换系统默认的TabBar。
- (void)setFrame:(CGRect)frame {
    if ([[[UIDevice currentDevice] modelName] isEqualToString: @"iPhone X"]) {
        if (frame.origin.y < ([UIScreen mainScreen].bounds.size.height - 83)) {
            frame.origin.y = [UIScreen mainScreen].bounds.size.height - 83;
        }
    }
    [super setFrame: frame];
}
(3)其他方法。

总结:

iOS11系统改变还是比较大的,某些地方需要注意适配,不然会出现很奇怪的现象。暂时,在iOS11遇到这么多坑,以后遇到会继续分享的。

参考:

你可能需要为你的 APP 适配 iOS 11

相关文章

网友评论

  • 坏坏De学长:[[UIDevice currentDevice] modelName] 你这个modelName是哪儿来的啊
  • 对酒当歌的夜:你那个会出两个问题,一个就是push后左边会多一个系统的蓝色的返回按钮,,二就是不能直接设置item的title,需要放个lable到自定义的titleview,我只想修改返回按钮的区域,后来找到这个,也不用什么代码自动就好了https://github.com/spicyShrimp/UINavigation-SXFixSpace
    一剑孤城:@对酒当歌的夜 :+1:
  • Xavier_Lost:largetitle官方说是一起是145pt,而你加起来只有140pt:sweat:
    Xavier_Lost:但是自己看层次是140
  • SoaringHeart:[scrollView performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)];
    这里的@(2)不明白,求解释 :blush:
    SoaringHeart:@一剑孤城 懂了 感谢:kissing_heart:
    一剑孤城:这是个枚举类型,@(2)就是选择值为2的枚举。
  • 71169b443266:有联系方式吗?出现了比较奇葩的bug,联系我QQ179415791,谢谢
  • Beyond无状态:我设置titleview:UIButton *searchBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, Main_Screen_Width*3/5, 30)], titleview = searchBtn.在iOS11上push返回来titleview就缩的很小,这是怎么回事啊博主
  • Damon22:您好, iOS11之前,在iPhone6p上是20p,在iPhone6p之前是16p.
    这个在iPhone6p之前是什么之前呢?不是很明白. 求解答
    Damon22:@一剑孤城 谢谢, 这下我就明白了
    一剑孤城:@Damon22 不好意思没说清,这里应该是非p机型
  • overla5:你好,视图层级工具是什么
    overla5:@一剑孤城 是不是要花钱买正版的那个
    一剑孤城:@失格人间 Reveal
  • 啊哈哈哈哈哈群:大佬 我导航栏item变大 怎么也改变不了尺寸啊
  • Macgx:接收到退出登录通知然后popToRootViewController时,tabBar上移了一段距离,底下留白,此时执行push界面操作后tabBar恢复正常,这是hidesBottomBarWhenPushed导致的吗,有没有解决方案,我快疯了😂
    一剑孤城:有呀,在适当的时机改变tabbar的frame就好了。:sweat_smile:
  • rain__bow__:请问,第四条tabbar上移的问题,真机上还有么?手里目前没真机😂
    rain__bow__:@一剑孤城 您好,我问下,目前用的xib写的页面,想判断iOS9以上开启safeArea 但是iOS9以下的不开启,可以吗?需要怎么操作
    rain__bow__:@一剑孤城 好吧:sweat_smile:
    一剑孤城:@rain__bow__ 我也没有真机,所以,不知道呀:joy:
  • 雅尘:项目目前遭遇两个问题,不知道怎么解决:
    1.在iOS10下运行不出行启动崩溃,在ios11下运行启动时出现部分崩溃,不知道怎么解决,关键是测了好几次都没问题,老板和销售的机器就崩溃了,前端和后台的没事
    2.项目提交被拒了,提示我没有适配ios11的ipad版本,在ipad上面高度会发生变化 ,但是iphone上ios都没有问题,然而我们公司不适配ipad的,所以不知道怎么办
    一剑孤城:device只选iPhone,不要选universal。崩溃的问题最好还是看一下崩溃日记的堆栈信息,然后再定位问题。
  • 亦歌三折:你好,请问 模拟器运行iPhone X ,[UIScreen mainScreen].bounds.size.height 高度为什么是667呢? 其他的模拟器运行高度正常
    一剑孤城:@亦歌三折 怎么解决的?什么原因呀?
    亦歌三折:@一剑孤城 谢谢你,已经解决咯哈:smile:
    一剑孤城:@亦歌三折 讲道理不会呀,没遇到过这个情况:scream::scream::scream:
  • iVikings:#define  adjustsScrollViewInsets(scrollView)\
    do {\
    _Pragma("clang diagnostic push")\
    _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"")\
    if ([scrollView respondsToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
        NSMethodSignature *signature = [UIScrollView instanceMethodSignatureForSelector:@selector(setContentInsetAdjustmentBehavior:)];\
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];\
        NSInteger argument = 2;\
        invocation.target = scrollView;\
        invocation.selector = @selector(setContentInsetAdjustmentBehavior:);\
        [invocation setArgument:&argument atIndex:2];\
        [invocation retainArguments];\
        [invocation invoke];\
    }\
    _Pragma("clang diagnostic pop")\
    } while (0)

    这个方法没毛病,用你写的那个方法,在scrollView嵌套tableView的情况下,scrollIndicator的位置有问题
  • 李大戮:Push VC下不好使,返回按钮不能用上级Title,需要重新设置返回按钮。
  • 那样风采:estimatedRowHeight、estimatedSectionFooterHeight、estimatedSectionHeaderHeight设置为0解决不了留白的问题了????是最近iOS11有过变化吗,还是模拟器的原因,我是用xcode9 运行在iPhoneX的模拟器上的。。
    那样风采:@一剑孤城 而且,
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
    return 0;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
    {
    return 0;
    }

    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return nil;
    }
    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    return nil;
    }
    这样是可以完美解决留白的,可是再次基础上在设置estimate三个属性为0,留白问题又出现了。。单独设置estimate三个属性为0不行,并且如果不设置为0,设置成一个较小的浮点数的话,留白会明显变少,但是无法消除。
    那样风采:没有设置。
    _listTable = [[UITableView alloc]initWithFrame:tableRect style:UITableViewStyleGrouped];
    _listTable.backgroundColor = [UIColor clearColor];
    _listTable.delegate = self;
    _listTable.dataSource = self;
    [self.view addSubview:_listTable];

    就这样然后设置estimate的三个属性为0。委托方法也只实现了下面的几个:

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    }
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    }

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    }

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{}

    一剑孤城:有设置footer和header的高度吗?
  • 随风风流:那么多的导航栏,那么多的tableView需要一个个找出来修改吗,原理懂了,有没有快捷的一次性修改属性的方法。适配整个APP而不是部分页面的适配。
    一剑孤城:1.可以写在基类里面,由子类继承
    2.hook一下viewDidLoad的方法,统一设置
    3.其他方法。
  • xgkf666:大神,adjustsScrollViewInsets_NO 这个里面的do{}while(0) 是不是不必要啊?
    一剑孤城:@xgkf666 这个防止写if语句没有写{}
  • Maj_sunshine:我想问下我升了xcode9,不适配iphonex能上架么。因为好像safeArea只能在iOS9以上,在iOS8用不了,或者有什么解决办法么
    一剑孤城:可以呀,判断一下系统版本就好了呀
    Maj_sunshine:@一剑孤城 你们适配iPhonex iOS9以下还能用么
    一剑孤城:App上架和适不适配iPhoneX没关系呀,但是不适配可能会在iPhoneX上显示异常而已。
  • 7ac161573ae3:我得tabbar 高出了很多 请问怎么修改?
    一剑孤城:@Angel11 是不是iPhoneX的尺寸?这个高出的部分是全面屏底部的半圆角,系统默认的,如果想改,可以试试修改一下tabbar的frame。
  • _码奴:为什么我把你demo中的代码都粘贴过去了,titleView左右还是有边距
    一剑孤城:titleview左右的边距是多少?
    _码奴:@一剑孤城 看哪个titleView的结构,是看我写的titleView吗,我的titleView就是一个View,上面添加了一些button和imageView
    一剑孤城:@_码奴 看一下titleview的层级结构
  • Gizone_iac:我的天,为什么我的NavigationBar上什么都没有 ,即使我用XIb也一样。
    一剑孤城:@Gizone_iac :flushed: 你是不是将titleview设置成屏幕的宽度了?item设置的是导航栏本身的item?看一下层级,是不是被遮挡住了。
    Gizone_iac:@一剑孤城 就是变成了没有Item 的了 , 就算用XIB 设置了Item也一样
    一剑孤城:什么意思?
  • noname004:extendRegionType 用runtime来为view添加,这是类属性 ,会导致所有的view都被设置成同一个值,你设置navigationBarView.extendRegionType = ClickExtendRegion; 等于把所有的view都会执行 if (self.extendRegionType == ClickExtendRegion) 这个进去了。。。那这个属性设置还有什么意义?
    一剑孤城:@noname004 这只是提供一种实现的思路,可以优化
  • c06161d82502:我同时设置了titleView和barButton,问题:customTitleView在push返回之后失去响应。
    在当前customTitleView的图层关系:UINavigationBar - UINavigationBarContentView - UITAMICAdaptorView - SoulPuppetCustomView
    在push后返回当前页面的custom图层关系:UINavigationBar - UINavigationBarContentView - SoulPuppetCustomView
    想问一下这是由于什么原因造成的。
    c06161d82502:@一剑孤城 重写了intrinsicContentSize可以了。
    c06161d82502:@一剑孤城 没有,而且只有第一次push返回后有问题,再push一次之后返回就可以响应了。我是在viewDidAppear中做的请求,根据请求到的数据去更新customtitleview
    一剑孤城:push的页面有设置titleview吗?
  • 62b9b63e1d3b:关于自定义导航栏的问题,感觉你写的有些麻烦,首先写了UIview的类目重置点击事件,你会影响所有的UIview类型,最好自定义一个view来实现,其次就是直接自定义一个view,赋值给导航栏titleView,设置左右两个按钮来自定义左右navbarButton.实现即可
    一剑孤城:@梧桐梦 这只是实现的思路,当然会有更好的方法
  • noname004:App需要实现导航栏左右按钮边距为0 的第二个弄titleView的方法 会把navigationBar的tiele挡住了怎么办? 我有个想法 能不能设置一个leftBarButtonItem = view ,这个View用你的category扩大点击范围 然后 button添加在这个view上。、、这个方法是否可行?
    noname004:@一剑孤城 感谢作者大大!!我的想法实现了。我在你代码基础上 多嵌套了一层 if实现了了我的想法。。。部分代码如下:
    if (!hitView && [NSStringFromClass([self class]) isEqualToString: @"_UIButtonBarStackView"]) {

    for (UIView *subview in self.subviews) {
    if (subview.subviews > 0) {

    if ([NSStringFromClass([subview class]) isEqualToString: @"_UITAMICAdaptorView"]) {。。。。。
    一剑孤城:@noname004 在iOS11上这样应该不行,因为barbutton是放在uistackview里面使用相对布局的,不过你可以试试。至于,title被挡住的问题,可以使用uibutton覆盖,直接设置button的title就好。
  • 55539d33e5e3:能不用宏 写成工具方法可以吗?
    krmao:我也遇到了,解决了没?
    一剑孤城:@baolian 理论上是可以的,毕竟宏也只是代码段的替换。
  • Stone_熊小叔:iOS11在自定义导航栏的时候出现了一个UIBarBackground的东西,但是没有API处理掉?
    一剑孤城:看不到图不知道黑的条出来是什么情况?
    Stone_熊小叔:@一剑孤城 在iOS10上面是没有的。在11上出来的。我进这个界面的时候会闪一下然后出来一个黑的条,看了图层就是这个东西,想知道有没有办法解决掉它:disappointed_relieved:
    一剑孤城:@Stone_熊小叔 为什么要处理掉这个view?这个是导航栏的容器view呀
  • a1655a01d08b:大神,我想加个自定义UIView在_UIButtonBarStackView上面,怎么做呢?
    一剑孤城:@a1655a01d08b 你可以直接把_UIBarBackground这个view遍历出来,然后直接insert你自定义的view就好,或者你也可以把view添加在titleview上面,设置一下view的位置和高宽就好。
    a1655a01d08b:非常谢谢大神,我想把这个自定义的UIView放在整个导航栏上,当做背景用(目的:滑动来渐变背景色),要怎么做啊
    一剑孤城:@a1655a01d08b 将自定义的view设置为barButtonItem的customeview就好了
  • c23f783a2af4:在设置rightBarButtonItem加载了一个网络图片,跳进下一个页面返回的时候frame改变了是怎么回事呢?
    一剑孤城:@蚂蚁在前进 本地图片和网络图片的尺寸一样吗?这个自定义组件是button还是imageview?内容填充方式是什么?
    c23f783a2af4:@一剑孤城 就是自定义的啊,加载本地图片没问题,加载网络图片frame会改变,好奇怪啊
    一剑孤城:@蚂蚁在前进 rightBarButtonItem都是用系统的?前后两个controller的navigationbar的样式是否一样,有没有在第二个页面修改过navigationbar或者加载网络图片完成式,刷新页面修改了frame?
  • zeroskylian:在iOS11对导航栏里面的item的边距也做了调整,titleView调整最大的宽带,边距在iPhone6p上是20p,在iPhone6p以下是16p;在iOS11以下,这个边距分别是12p和8p;如果设置了左右navigationBarButton,则在iOS11里,navigationBarButton的边距是20p和16p;在iOS11以下,也是20p和16p;如果同时设置了titleView和navigationBarButton,则在iOS11以下,它们之间的间距是6p,在iOS11则无间距

    这段话怎么断句呢
    nevsee:@一剑孤城 如果设置了左右navigationBarButton,则在iOS11里,navigationBarButton的边距是20p和16p;在iOS11以下,也是20p和16p;这个又是指的什么
    nevsee:@一剑孤城 还是不明白。在iOS11对导航栏里面的item的边距也做了调整,titleView调整最大的宽带,边距在iPhone6p上是20p,在iPhone6p以下是16p ;在iOS11以下,这个边距分别是12p和8p;这个指的是item距离屏幕吧?
    一剑孤城:前面指的是item距离屏幕的距离,后面指的是titleView距离屏幕的距离。
  • iOS白水:titleView调整最大的宽带,在iPhone6p以下是16p。 为什么iOS11 上面,还是 8p呢? 而不是16p呢?
  • coderYL:第三点"边距"指的是哪个方向?
    一剑孤城:@张银龙 titleView设置为屏幕宽度时距离屏幕边缘的距离
  • 熟能生巧HN:第四点在模拟器上有问题,但是在真机上又是正常的,你知道为什么吗?
    ebay_Happy:@乔_bfe9 xcode8打包的程序怎么可以在iOS11运行呢
    熟能生巧HN:@一剑孤城 其实是xcode8打包的程序在iOS11系统真机上是正常的,xcode9打包的程序会出现问题
    一剑孤城:@乔_bfe9 导航栏边距为0吗?我都是在模拟器上搞的呀。。。:flushed:

本文标题:App界面适配iOS11(包括iPhoneX的奇葩尺寸)

本文链接:https://www.haomeiwen.com/subject/hqrmrxtx.html