10分钟适配 iOS 11 & iPhone X

作者: 臭码农 | 来源:发表于2017-09-22 19:27 被阅读8817次

适配中的问题及解决办法

1. 滚动条高度跳动、上下拉刷新问题:

self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

2. 列表/页面偏移

设置工程中的UITableViewUICollectionViewUIScrollViewcontentInsetAdjustmentBehavior属性,如下:

if (@available(iOS 11.0, *)){
        _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    }

总的来说所有继承与Scrollview 及其子类都需要设置 contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever ,每个设置很麻烦,没关系。由于UIView及其子类都遵循UIAppearance协议,我们可以进行全局配置:

// AppDelegate 进行全局设置
    if (@available(iOS 11.0, *)){
        [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }
注意:

调用系统相册时列表内容发生偏移可以参考这篇文章 iOS11 系统适配中遇到的问题(1)UIImagePickerController

3. 导航栏按钮位置问题

iOS 11重新调整了导航栏的元素,强制将leftButtonsrightButtons位置往屏幕中央靠了一些,在这之前通过添加一个UIBarButtonSystemItemFixedSpace 把宽度设为负数以调整按钮的边距

    //调整按钮边距
//    UIBarButtonItem* spaceItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
//    //将宽度设为负值
//    spaceItem.width= -5;
//    [items addObject:spaceItem];

iOS 11如上设置是无效的
如果你无法接受系统给设定的位置,可以试试下面的方法

#pragma mark  导航栏 添加文字按钮
- (NSMutableArray<UIButton *> *)addNavigationItemWithTitles:(NSArray *)titles isLeft:(BOOL)isLeft target:(id)target action:(SEL)action tags:(NSArray *)tags
{
    
    NSMutableArray * items = [[NSMutableArray alloc] init];
    
    //调整按钮位置
//    UIBarButtonItem* spaceItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
//    //将宽度设为负值
//    spaceItem.width= -5;
//    [items addObject:spaceItem];
    
    NSMutableArray * buttonArray = [NSMutableArray array];
    NSInteger i = 0;
    for (NSString * title in titles) {
        UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom];
        btn.frame = CGRectMake(0, 0, 30, 30);
        [btn setTitle:title forState:UIControlStateNormal];
        [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
        btn.titleLabel.font = SYSTEMFONT(16);
        [btn setTitleColor:KWhiteColor forState:UIControlStateNormal];
        btn.tag = [tags[i++] integerValue];
        [btn sizeToFit];
        
        //设置偏移
        if (isLeft) {
            [btn setContentEdgeInsets:UIEdgeInsetsMake(0, -10, 0, 10)];
        }else{
            [btn setContentEdgeInsets:UIEdgeInsetsMake(0, 10, 0, -10)];
        }
        
        UIBarButtonItem * item = [[UIBarButtonItem alloc] initWithCustomView:btn];
        [items addObject:item];
        [buttonArray addObject:btn];
    }
    if (isLeft) {
        self.navigationItem.leftBarButtonItems = items;
    } else {
        self.navigationItem.rightBarButtonItems = items;
    }
    return buttonArray;
}

此法实属障眼法,并不完美,通过设置内容偏移,让按钮视觉上看起来位置改变了,实际位置并没有发生变化,这可能导致按钮部分区域响应点击事件。
若追求完美,可以试着自定义UIButton重写hitTest方法尝试改变点击区域。
若有其他完美的办法请联系我更新。

4. 位置权限

在IOS11,原有的NSLocationAlwaysUsageDeion被降级为NSLocationWhenInUseUsageDeion。因此,在原来项目中使用requestAlwaysAuthorization获取定位权限,而未在plist文件中配置NSLocationAlwaysAndWhenInUseUsageDeion,系统框不会弹出。建议新旧key值都在plist里配置,反正我试下来是没有问题,唯一的区别是使用requestAlwaysAuthorization获取权限 IOS11系统弹框会把几种权限级别全部列出,供用户选择,显然更人性化了。
快去更新你的info.plist

    <!-- 位置 -->
    <key>NSLocationUsageDescription</key>
    <string>获取地理位置,精准推送服务</string>
    <!-- 在使用期间访问位置 -->
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>获取地理位置,精准推送服务</string>
    <!-- 始终访问位置 -->
    <key>NSLocationAlwaysUsageDescription</key>
    <string>App需要您的同意,才能始终访问位置</string>
    <!-- iOS 11访问位置 -->
    <key>NSLocationAlwaysAndWhenInUseUsageDeion</key>
    <string>App需要您的同意,才能始终访问位置</string>

5. iPhone X 适配

iPhone X 变化最大的是头部 & 底部
非iPhone X :
StatusBar 高20pt,NavigationBar 高44pt,底部TabBar高49pt
iPhone X:
StatusBar 高44pt,NavigationBar 高44pt,底部TabBar高83pt
所以,之前项目里写死的 ±49 ±64 都要出问题,如果你之前抽离出来使用的是宏,那问题不大,如果不是,开始搬砖吧少年。
送你几个宏,来日好好撸,莫偷懒

#define kStatusBarHeight [[UIApplication sharedApplication] statusBarFrame].size.height
#define kNavBarHeight 44.0
//注意:请直接获取系统的tabbar高度,若没有用系统tabbar,建议判断屏幕高度;之前判断状态栏高度的方法不妥,如果正在通话状态栏会变高,导致判断异常,下面只是一个例子,请勿直接使用!
#define kTabBarHeight kAppDelegate.mainTabBar.tabBar.frame.size.height
#define kTopHeight (kStatusBarHeight + kNavBarHeight)

替换 64pt →kTopHeight
替换 49pt →kTabBarHeight

6. iPhone X push的时候TabBar上移

答案在这:适配iPhone X Push过程中TabBar位置上移

这样可以解决大部分因位置导致的适配问题

请关注点❤️,持续更新……
iOS 超级码农交流群:538549344 技术大牛在等你来提问

以上属于臭码农原创,若有雷同属巧合,如有错误望指正,转载请标明来源和作者。
by:臭码农

相关文章

网友评论

  • Farmers:// AppDelegate 进行全局设置
    if (@available(iOS 11.0, *)){
    [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }

    这个方法慎用 ,会引起相册,以及browser的 UI错乱,相册可以通过修改nav的translucent,但是browser 没有找到办法
    Farmers:@小白人生 http://www.jianshu.com/p/fc48638325f6
    4e935a9983df:@Farmers 请问这个怎么解决的啊?
    臭码农:@Farmers 嗯,多谢提醒
  • BohrIsLay:楼主,我最近使用MJRefresh, 刷新头部的" loaing...文字 " 和 “菊花转圈“ 都没有居中," pull down to refresh" 直接显示在tableView上,该怎么修改呀
    BohrIsLay:补充,xcode 9 模拟器选的iphone 6, iphone X, 真机iPhone 6 , iphone 5s都这样
  • 无夜之星辰:当手机的热点被接入时,iPhone X之前的机型其状态栏的高度会变成40,所以用“[[UIApplication sharedApplication] statusBarFrame].size.height>20?83:49”来表示tabbar的高度可能会有问题
    王大吉Rock:@臭码农 开启热点的时候会接收到通知的,在回调里面做下调整就可以了,还有问下你的群怎么不能进了,这是我的qq:605479355,希望可以一起交流
    臭码农:@无夜之星辰 有道理 我回去看看 多谢提醒
  • YYYYYY25:你好作者,我在appdelegate中设置
    if (@available(iOS 11.0, *)){
    [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }
    UIImagePickerController 上移了大约64个像素,不知道怎么解决,望回答
    臭码农:@YYYYYY25 请问如何解决的?禁用毛玻璃还是设置了他的scrollview为automatic
    YYYYYY25:@臭码农 我现在暂时解决了,因为全局对scrollview进行设置,且UIImagePickerViewController的navigationbar默认是透明的,所以上移了。
    臭码农:@YYYYYY25 针对这个VC设置automic可以嘛?
  • 打酱油的小鲜肉:// AppDelegate 进行全局设置
    if (@available(iOS 11.0, *)){ [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }
    这样设置后调用相册相册会上移
    YYYYYY25:我的也有问题 UIImagePickerController present出来会上移64个单位,不知道怎么解决,对pickerController设置吗?这个不是系统的吗?
    打酱油的小鲜肉:@臭码农 其实我是因为mjrefresh的没适配,所以用了这个,但又出现我说的问题,所以我单独给表视图设置
    臭码农:@打酱油的小鲜肉 我这边相册没有问题哎,你试着在相册页面单独设置一下?
  • 屮艸芔:帮了大忙了,谢谢楼主
  • Yaanco:多谢楼主
  • yunxiu:支持下群主!!
    臭码农:@yunxiu 多谢!:kissing_heart:
  • TongRy:沙发,哈哈

本文标题:10分钟适配 iOS 11 & iPhone X

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