iOS14更新后的適配鼠次,在項目中遇到的一些問題慨代,持續(xù)更新中~
除了這個鏈接下面邢笙,還遇到了一些其他的問題
http://www.reibang.com/p/1803bd950b90
說明:
當前的這些問題,使用 < Xcode12打包上線appStore鱼响,或者打的adHoc包鸣剪,安裝在iOS14系統(tǒng)的手機上,可能一切正常丈积。
當使用Xcode12直接打包筐骇,或者調(diào)試iOS14系統(tǒng)手機才會出現(xiàn)。
1江滨、gif加載圖片問題
項目中可能會有加載gif和png,jpg的需求铛纬,Xcode12調(diào)試運行,發(fā)現(xiàn)圖片不見了唬滑。
現(xiàn)象:
原因:
1.1告唆、使用SDWebImage比較老的庫<沒有一個個的驗證,我們用的是5.8.0>中的SDAnimatedImageView
加載網(wǎng)絡(luò)圖片晶密,會造成加載失敗
1.2擒悬、使用YYImage的最新庫<當前是1.0.4,上次更新是2017年>中的YYAnimatedImageView
加載網(wǎng)絡(luò)圖片稻艰,會造成加載失敗
可能這兩個庫沒有在項目中直接使用懂牧,但是如果使用了一些三方的大圖瀏覽之類的三方庫,可能會出現(xiàn)圖片加載失敗的情況尊勿,比如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<進度條>變粗了
現(xiàn)象:
原因:
iOS14验懊,UIProgressView默認高度變?yōu)?,之前是2尸变,如果產(chǎn)品要求保持之前的高度鲁森,需要進行適配
適配方案:
- (UIProgressView *)progressView {
if (!_progressView) {
_progressView = [[UIProgressView alloc] initWithFrame:self.bounds];
_progressView.progressTintColor = JMIBaseColor;
_progressView.trackTintColor = JMIColor(0xD8D8D8);
// 適配iOS14,UIProgressView高度變?yōu)?
if (CGRectGetHeight(_progressView.frame) == 4) {
_progressView.transform = CGAffineTransformMakeScale(1.0, 0.5);
}
}
return _progressView;
}
3振惰、UITableviewCell歌溉、UICollectionViewCell中的內(nèi)容無法響應(yīng)或者不可見
現(xiàn)象
UITableviewCell、UICollectionViewCell 上的按鈕骑晶,點擊沒有響應(yīng)了
UITableviewCell痛垛、UICollectionViewCell 上的控件看不到了
UIConnectionViewCell如果不對contentView做操作的話,暫時沒事桶蛔,比如設(shè)置了下contentView.backgroundColor就有問題了,蘋果應(yīng)該是對contentView使用了懶加載
原因
在iOS14匙头,蘋果修改了UITableViewCell的控件層級結(jié)構(gòu),將contentView移動到了最上層仔雷,所以直接添加到self上的控件將會被contentView擋住
適配方案:
將cell上相關(guān)控件蹂析,添加到self.contentView
上面
[self.contentView addSubview:self.showLabel];
[self.contentView addSubview:self.btn];
其他建議:
為了保險,將UICollectionViewCell碟婆、UITableViewHeaderFooterView
上面的控件也添加到contentView上面电抚,鬼知道蘋果下一次升級是不是默認會把contentView搞到最上層
4、UITableview 分組高度設(shè)置為0.01會出現(xiàn)一根線
現(xiàn)象:
如下結(jié)構(gòu)代碼
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;
}
在之前竖共,當tableView.style = UITableViewStyleGrouped的時候蝙叛,設(shè)置sectionHeader和sectionFooter的高度為0的時候,往往設(shè)置0不管用<iOS10>公给,會設(shè)置個0.01借帘。為了封裝方便,可能有的時候當tableView.style = UITableViewStylePlain的時候淌铐,也會這么干肺然。
這樣就會使得tableView.style = UITableViewStyleGrouped/UITableViewStylePlain的時候讓sectionHeader和sectionFooter的高度看不到了
但是在iOS14,就會出現(xiàn)上面說的那種情況,當然了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兩種類型都有,那么進行相關(guān)的判斷
- (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 消除大作戰(zhàn)
ITMS-90809:廢棄API用法- 2020年12月將不再接受使用UIWebView的應(yīng)用程序更新加叁。相反倦沧,使用WKWebView來提高安全性和可靠性
基本上每次上線都能看到這個東西,近期聽說集團有App上線已經(jīng)因為這個UIWebView被拒了唇撬。所以來次大檢查吧
1、檢測源碼中是否有UIWebView展融,或者UIWebViewDelegate
這個直接在搜索框中搜索即可
2窖认、源碼中沒有UIWebView不代表安全了,通過Mach-O來全面查找吧
otool -oV [Mach-O路徑] | tee [檢測結(jié)果日志文件名稱].log
otool -oV /Users/a58/Desktop/Tools/XXX.app/XXX | tee classInfo.log
解釋
otool -oV [Mach-O路徑]
是獲取所有的類結(jié)構(gòu)及其定義的方法
| tee classInfo.log
由于打印的東西較多,我們在終端中顯示不下扑浸,可以將終端打印的東西搞到文件中
直接在.log中查詢UIWebView即可
通過該方法可以找到相關(guān)的三方庫中的UIWebView和相關(guān).a
.framework中的UIWebView烧给,然后進行相關(guān)的升級和替換
如果你在項目中還遇到了其他的一些問題,評論區(qū)見~~