IOS11 升级遇到的问题

作者: 淘码小工 | 来源:发表于2017-09-24 11:11 被阅读2730次

    1.tableView heightForHeader 和 heightForFooter 两个delegate不执行

    在升级到IOS11以后,测试移动办公平台发现以前设计的heightForHeader和heightForFooter变成默认高度,delegate中设置的高度没有执行,上网查了以下资料,发现需要在实例化tableView的时候加上

    self.tableView.estimatedRowHeight = 0;
    if (@available(iOS 11.0, *)) {
        //当有heightForHeader delegate时设置
        self.tableView.estimatedSectionHeaderHeight = 0;
        //当有heightForFooter delegate时设置
        self.tableView.estimatedSectionFooterHeight = 0;
    }
    

    注意:上面的注释的两句代码,需要当设置了他的delegate的时候才设置,如果没有设置delegate,还是用上面的代码的话,会出现header高度和footer高度都是默认值,而不是上面的值。如果不加版本判断的话,ios11之前的版本又会出问题。

    2. 导航栏遮盖使用automaticallyAdjustsScrollViewInsets的问题及解决方法

    在测试知行办公中类似于微信朋友圈的圈子功能时,发现iOS10中被导航栏遮盖的下拉刷新在IOS11中出现在导航栏下面,这样下拉刷新一直存在,而不是隐藏起来。
    以前的代码是这样写的:

    //在viewDidLoad中设置automaticallyAdjustsScrollViewInsets = NO
    self.automaticallyAdjustsScrollViewInsets = NO;
    //并且在添加下拉刷新View时,其frame的设置是
    self.keyBoardInputView = [[NTKeyBoardInputHeadView alloc] initWithFrame:CGRectMake(0, DEVICEHIGHT, DEVICEWIDTH, 50)];
    

    automaticallyAdjustsScrollViewInsets的使用可以参考automaticallyAdjustsScrollViewInsets解析

    在IOS11中这个automaticallyAdjustsScrollViewInsets属性被废弃了,所以当tableView超出安全区域时系统自动调整了SafeAreaInsets值,进而影响adjustedContentInset值,在iOS 11中决定tableView的内容与边缘距离的是adjustedContentInset属性,而不是contentInset。
    解决方法我是如下写的:

    //其实不用判断两层,@available(iOS 11.0)会有一个else的
     if(isIOS11AndLater){
            if ([self.tableView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
                if (@available(iOS 11.0, *)) {
                    self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
                }
            }
        }else {
            self.automaticallyAdjustsScrollViewInsets = NO;
        }
    

    参考iOS 11 安全区域适配总结

    3. iOS11 navigationItem.titleView 适配问题

    在测试程序时,返现自定义的titleView跟默认的title字体都出来了,上网查了一下,看人家的回答是

    在iOS11 自定义titleview里有个button,点击事件不触发了.的解决办法如下:
    1:在自定义titleview 里重写 intrinsicContentSize 属性,代码如下:

    @property(nonatomic, assign) CGSize intrinsicContentSize;
    

    2:然后在 self.navigationItem.titleView = _titleView; 之前加入下面的代码:

    _titleView.intrinsicContentSize = CGSizeMake(200, 40);
    

    CGSizeMake(200, 40); 宽高 自己根据实际情况自己设置具体值就可以了。这样titleview 里的button 应该就可以点击了。

    查看原文

    4 IOS11 TableView contentSize异常

    在测试知行办公时,发现我们聊天页面聊天记录不会自动显示最后一条的信息,使用IOS10是正常的,心里又开始骂娘了。我们的代码是这样写的,在ChatTableView中有如下代码:

    - (void)setContentSize:(CGSize)contentSize
    {
        // 为避免在首次初始化时造成干扰, 只有contentSize不等于(0,0)时才自动根据size大小调整offset(高度扩大多少, offset就调整多少)
        if (!CGSizeEqualToSize(self.contentSize, CGSizeZero))
        {
            if (contentSize.height > self.contentSize.height)
            {
                CGPoint offset = self.contentOffset;
                offset.y += (contentSize.height - self.contentSize.height);
                self.contentOffset = offset;
            }
        }
        [super setContentSize:contentSize];
    }
    

    看网上的解释

    动画的操作是观察tableView的contentOffset变化后执行的,异常动画发生在tableView reloadData之后,也就是说tableView reloadData之后,tableView的contentOffset发生了几次变化。查了下资料发现原因是iOS11中默认开启了Self-Sizing,在WWDC 2017 session204 Updating Your App for iOS 11 中有介绍,因此研究了下这个session,本文作为一个总结,下文的第三部分会有对上述的动画异常的原因分析及解决方式。

    Table Views :在iOS 11中默认启用Self-Sizing
    这个应该是UITableView最大的改变。我们知道在iOS8引入Self-Sizing 之后,我们可以通过实现estimatedRowHeight相关的属性来展示动态的内容,实现了estimatedRowHeight属性后,得到的初始contenSize是个估算值,是通过estimatedRowHeight x cell的个数得到的,并不是最终的contenSize,tableView不会一次性计算所有的cell的高度了,只会计算当前屏幕能够显示的cell个数再加上几个,滑动时,tableView不停地得到新的cell,更新自己的contenSize,在滑到最后的时候,会得到正确的contenSize.

    Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension:

    Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension:
    

    解决方法在tableView 实例化时,加入

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

    iOS11下,如果没有设置estimateRowHeight的值,也没有设置rowHeight的值,那contentSize计算初始值是 44 * cell的个数,如下图:

    查看原文

    5. 适配iPhone X机型

    使用iPhone X运行我们的程序,发现顶部和底部有黑边,没有适配全屏。在网上查了一下,原因是启动页我们使用的launchImage是在Imagex.xcassets加载的,而不是使用的storyboard。解决办法是添加一张尺寸为 1125 x 2436 的 LaunchImage。需要在LaunchImage中的Attribute Inspector中选中 iOS8.0 and Later中的Portrait,如下:

    B67B985F-B0F0-4774-910E-7FB8AA7754AD.png

    再把图片拖上去就OK了

    FAC89CFD-582D-41B9-868B-98AF7B2FD74E.png

    6. iPhone X机型自定义tabBar显示问题

    当使用自定义的tabBarController时,由于iPhoneX由于底部安全区的UITabBar高度由49pt变成了83pt,主要是tabBar高度及tabBarItem偏移适配出现问题,可以通过判断机型来修改相关界面代码

    #define kDevice_Is_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
    

    可以通过机型判断,再自己写偏移配置



    知行办公,专业移动办公平台https://zx.naton.cn/
    【总监】十二春秋之,3483099@qq.com
    【Master】zelo,616701261@qq.com
    【运营】运维艄公,897221533@qq.com;****
    【产品设计】流浪猫,364994559@qq.com
    【体验设计】兜兜,2435632247@qq.com
    【iOS】淘码小工,492395860@qq.comiMcG33K,imcg33k@gmail.com
    【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com
    【java】首席工程师MR_W,feixue300@qq.com
    【测试】土镜问道,847071279@qq.com
    【数据】fox009521,42151960@qq.com

    相关文章

      网友评论

      本文标题:IOS11 升级遇到的问题

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