iOS 知识点iOS开发攻城狮的集散地iOS学习收录

IOS11 升级遇到的问题

2017-09-24  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读