推广

iOS 14适配,项目中遇到的那些坑

iseeyu2年前 (2024-02-21)推广125

image.png

原因:
1.1、使用SDWebImage比较老的库<没有一个个的验证,我们用的是5.8.0>中的SDAnimatedImageView加载网络图片,会造成加载失败

1.2、使用YYImage的最新库<当前是1.0.4,上次更新是2017年>中的YYAnimatedImageView加载网络图片,会造成加载失败

可能这两个库没有在项目中直接使用,但是如果使用了一些三方的大图浏览之类的三方库,可能会出现图片加载失败的情况,比如YBImageBrowser

适配方案:
1.1、SDWebImage直接升级到最新库即可
1.2、YYImage因为没有更新,可以考虑换成SDWebImage,或者直接修改YYImage的源码
- (void)displayLayer:(CALayer *)layer修改下,打成私有pod库

- (void)displayLayer:(CALayer *)layer {
    if (_curFrame) {
        layer.contents = (__bridge id)_curFrame.CGImage;
    } else {
        // If we have no animation frames, call super implementation. iOS 14+ UIImageView use this delegate method for rendering.
        if ([UIImageView instancesRespondToSelector:@selector(displayLayer:)]) {
            [super displayLayer:layer];
        }
    }
}

为啥这么修改呢?
参考SD的SDAnimatedImageView的修改

- (void)displayLayer:(CALayer *)layer
{
    UIImage *currentFrame = self.currentFrame;
    if (currentFrame) {
        layer.contentsScale = currentFrame.scale;
        layer.contents = (__bridge id)currentFrame.CGImage;
    } else {
        // If we have no animation frames, call super implementation. iOS 14+ UIImageView use this delegate method for rendering.
        if ([UIImageView instancesRespondToSelector:@selector(displayLayer:)]) {
            [super displayLayer:layer];
        }
    }
}

2、UIProgressView<进度条>变粗了

现象:

image.png

原因:
iOS14,UIProgressView默认高度变为4,之前是2,如果产品要求保持之前的高度,需要进行适配

适配方案:

- (UIProgressView *)progressView {
    if (!_progressView) {
        _progressView = [[UIProgressView alloc] initWithFrame:self.bounds];
        _progressView.progressTintColor = JMIBaseColor;
        _progressView.trackTintColor = JMIColor(0xD8D8D8);
        // 适配iOS14,UIProgressView高度变为2
        if (CGRectGetHeight(_progressView.frame) == 4) {
            _progressView.transform = CGAffineTransformMakeScale(1.0, 0.5);
        }
    }
    return _progressView;
}

3、UITableviewCell、UICollectionViewCell中的内容无法响应或者不可见

现象
UITableviewCell、UICollectionViewCell 上的按钮,点击没有响应了
UITableviewCell、UICollectionViewCell 上的控件看不到了

按钮看不到了.png

UIConnectionViewCell如果不对contentView做操作的话,暂时没事,比如设置了下contentView.backgroundColor就有题了,苹果应该是对contentView使用了懒加载

原因
在iOS14,苹果修改了UITableViewCell的控件层级结构,将contentView移动到了最上层,所以直接添加到self上的控件将会被contentView挡住

适配方案:
将cell上相关控件,添加到self.contentView上面

[self.contentView addSubview:self.showLabel];
[self.contentView addSubview:self.btn];

其他建议:
为了保险,将UICollectionViewCell、UITableViewHeaderFooterView
上面的控件也添加到contentView上面,鬼知道苹果下一次升级是不是默认会把contentView搞到最上层

4、UITableview 分组高度设置为0.01会出现一根线

现象:
如下结构代码

tableView.style = UITableViewStylePlain
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 0.01;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.01;
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    
    return nil;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    
    return nil;
}

image.png

在之前,当tableView.style = UITableViewStyleGrouped的时候,设置sectionHeader和sectionFooter的高度为0的时候,往往设置0不管用<iOS10>,会设置个0.01。为了封装方便,可能有的时候当tableView.style = UITableViewStylePlain的时候,也会这么干。
这样就会使得tableView.style = UITableViewStyleGrouped/UITableViewStylePlain的时候让sectionHeader和sectionFooter的高度看不到了

但是在iOS14,就会出现上面说的那种情况,当然了tableView.style = UITableViewStyleGrouped不受影响

适配方案:
1、当tableView.style = UITableViewStylePlain
iOS10~iOS14通用

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 0;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0;
}

2、如果当前封装的tableView两种类型都有,那么进行相关的判断

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (tableView.style == UITableViewStyleGrouped) {
        return 0.01;
    }
    return 0;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    if (tableView.style == UITableViewStyleGrouped) {
        return 0.01;
    }
    return 0;
}

5、UIWebView 消除大作战

ITMS-90809:废弃API用法- 2020年12月将不再接受使用UIWebView的应用程序更新。相反,使用WKWebView来提高安全性和可靠性

基本上每次上线都能看到这个东西,近期听说集团有App上线已经因为这个UIWebView被拒了。所以来次大检查吧
1、检测源码中是否有UIWebView,或者UIWebViewDelegate
这个直接在搜索框中搜索即可
2、源码中没有UIWebView不代表安全了,通过Mach-O来全面查找吧
otool -oV [Mach-O路径] | tee [检测结果日志文件名称].log

otool -oV /Users/a58/Desktop/Tools/XXX.app/XXX  | tee classInfo.log

解释
otool -oV [Mach-O路径]
是获取所有的类结构及其定义的方法
| tee classInfo.log
由于打印的东西较多,我们在终端中显示不下,可以将终端打印的东西搞到文件中

直接在.log中查询UIWebView即可

image.png

image.png

通过该方法可以找到相关的三方库中的UIWebView和相关.a
.framework中的UIWebView,然后进行相关的升级和替换

如果你在项目中还遇到了其他的一些问题,评论区见~~

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56710.html

相关文章

小编分享提升网站吸引力的方法是什么。

小编分享提升网站吸引力的方法是什么。

很多站长因为网站排名上不去感觉烦恼,不能够留住客户,网站跳出的频率不断下降。时间长了,肯定会对网站运行失去信息,并且后选择放弃。但是事实上,网站运行成功的比例还不到百分之二十,足够证明网站运行存在着一定困难。提升网站,才能提升网站的核心竞争力。下面就和大家简单的分享一下,怎样提升网站吸引力。...

“营”死比“销”死更光荣。

“营”死比“销”死更光荣。

有一次,我和一家小企业的老板聊天,提出这样的观点:企业越小越应该注重营销,而不是销售。于是这位老板将一大堆问题砸向我。他说:“小企业哪里找投资商?哪家银行敢给他们贷款?他们哪有钱引进高新技术?拿什么去开发高附加值产品?就算开发了,没有品牌谁会买呢?所以那些战略、品牌、创新等玩意儿,都是大企业的游戏。...

超全抖音变现方式及涨粉方法

超全抖音变现方式及涨粉方法

  作为一个互联网产品人,现在才开始认真研究抖音,其实挺失败的。 以前思想还停留在抖音是一个网红制造平台,利用推荐算法让你不停的刷,消耗着你的时间和精力,是一个观看者的心态;后知后觉的我,在抱怨中我只看到了抱怨本身,却忽略了为什么会抱怨,以及在这种抱怨声中,我们能有哪些机会,...

百度SEO排名信号,值得关注的6个方向。

百度SEO排名信号,值得关注的6个方向。

对于每一个人员,我们都非常清楚,当你把所有的百度SEO排名信号,组合在一起的时候,实际上它就构成了搜索引擎的算法。 但相信即使在专业的SEO从业者,也很难罗列出所有的影响因子,比如说:前段时间,我们写了一个SEO培训的单页,由于排名上涨过快,被某些快排刷掉,这可能也是一个影响因子,但我们有的时候并...

销售技巧常用的5种话术技巧

销售技巧常用的5种话术技巧

 销售就是通过语言来说服顾客,一名销售高手沟通的时候会将,自己的观点和意见巧妙地传达给顾客,最终说服顾客。下面是小编为大家收集关于销售技巧常用的5种话术技巧,欢迎借鉴参考。  一、断言的方式  销售人员如果充分了解商品及客户情况  在客户面前就可以要很自信地说话  比如在讲...

网站做关键词排名优化,有必要实时跟踪排名优化效果。

网站做关键词排名优化,有必要实时跟踪排名优化效果。

在做的过程中,我们几乎每天都会监测网站排名的变化,特别是一些SEO人员,经常会根据网站排名的高低来衡量一个SEO项目的成败。 有人说,长期跟踪某个关键字的排名,不是我们目前关注的核心内容,而是整个站点的综合流量。 面对这样的问题,我们只能选择部分识别,比如:流量的重要性,但这并不意味着跟踪网站排...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片