本文正在参加「金石方案」

引言

假如依照开发标准写代码,不会存在关于UITableView的适配问题。

  • 假如依照标准使用UITableViewHeaderFooterView,就不会存在iOS16反正屏切换场景的页脚问题。
  • 假如依照标准增加UITableViewCell的子企图到UITableViewCellContentView,就不会存在iOS14被遮挡的问题。
  • 假如将tableView:viewForFooterInSection: 和tableView:heightForFooterInSection:办法都注释掉,就不会存在iOS10即便heightForFooterInSection高度回来0 也会显现视图的问题。

I iOS16.0 反正屏切换适配

调用完转屏办法今后,view需求从头更新frame

1.1 获取当时屏幕反正屏状况

  • (UIInterfaceOrientation)interfaceOrientation {// 获取当时屏幕反正屏状况 if (@available(iOS 13.0, *)) { return [UIApplication sharedApplication].windows.firstObject.windowScene.interfaceOrientation; } return [[UIApplication sharedApplication] statusBarOrientation]; }

1.2 iOS16.0调完转屏办法后,需求从头更新view的frame

问题:从电子签名界面回来之后,页脚的frame不正确

-(UIView*)tableView:(UITableView*)tableViewviewForFooterInSection:(NSInteger)section
{
UIButton*nextBtn=[ControlManagergetButtonWithFrame:CGRectMake(KWratio(30),KWratio(25),kWidth-KWratio(60),KWratio(45))fontSize:displayFontSize(15.0f)title:@"提交"titleColor:[UIColorwhiteColor]image:[UIImagenew]backgroundColor:BASE_RED_COLORcornerRadius:KWratio(5)];
returnxxx;
}

原因:iOS16.0调用完转屏办法今后,假如不是使用自动布局,view需求从头更新frame。

处理办法:自定义页脚和页眉(UITableViewHeaderFooterView代替 titleForHeaderInSection)

1.3 自定义页脚

UITableViewHeaderFooterView代替 titleForHeaderInSection

blog.csdn.net/z929118967/…

  1. 注册FooterView
[_tableViewregisterClass:[CRMNextBtnHeaderFooterViewclass]forHeaderFooterViewReuseIdentifier:@"CRMNextBtnHeaderFooterView"];
  1. 回来FooterView
-(UIView*)tableView:(UITableView*)tableViewviewForFooterInSection:(NSInteger)section
{
CRMNextBtnHeaderFooterView*footerView=[tableViewdequeueReusableHeaderFooterViewWithIdentifier:@"CRMNextBtnHeaderFooterView"];
//footerView.models=self.viewModel.passwordRuleDescModel;
returnfooterView;
}
  1. 完成FooterView

@interfaceCRMNextBtnHeaderFooterView:UITableViewHeaderFooterView
@property(nonatomic,weak)UIButton*nextBtn;
@property(nonatomic,weak)UIButton*cancelBtn;
@end

II 处理UITableViewCell兼容问题(iOS14适配)

kunnan.blog.csdn.net/article/det…

2.1 问题剖析

iOS14 UITableViewCell的子企图不能点击或许滑动等手势响应问题,发现有问题的cell根本都是直接增加到Cell的,经过Xcode自带的DebugViewHierarchy视图剖析发现问题的原因是:被体系自带的UITableViewCellContentView遮挡在底部了

iOS小技能:UITableView的适配 (iOS10/iOS14/iOS16.0)

2.2 处理方案

需求改标准的做法

cell.contentView.addSubView(tempView1)

全局修正适配

//
//UITableViewCell+CRMaddSubView.m
//Housekeeper
//
//Createdbymacon2020/9/18.
//Copyright2020QCT.Allrightsreserved.
//
#import"UITableViewCell+CRMaddSubView.h"
@implementationUITableViewCell(CRMaddSubView)
+(void)load{
//SwizzleaddSubView
[UITableViewCellsensorsdata_swizzleMethod:@selector(addSubview:)withMethod:@selector(kunnan_addSubview:)];

}
-(void)kunnan_addSubview:(UIView*)view{


if([viewisKindOfClass:NSClassFromString(@"UITableViewCellContentView")]){//答应addSubViewUITableViewCellContentView

[selfkunnan_addSubview:view];//完成办法,由于已经进行了swizzle,相当于调用原来的办法


}else{//

[self.contentViewaddSubview:view];

}
}
@end

III iOS10 体系关于UITableView的适配问题

由于目前根本找不到iOS10的真机了,要测验iOS10 可以下载模拟器。

  1. tableView numberOfRowsInSection:QCTReceiptsubFilterViewSection4KeyTypeTitle] 的使用执行次序在iOS10的很特别,不能在在办法中 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section调用,否则会形成死循环。
  2. heightForFooterInSection 在iOS10 即便高度回来0 也会显现视图

3.1 代理办法的执行次序

tableView:numberOfRowsInSection 不能在办法中 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ 调用,否则会形成死循环。

3.2 尾部视图的展示

在iOS10 中不显现viewForFooterInSection的正确做法是,将tableView:viewForFooterInSection: 和tableView:heightForFooterInSection:办法都注释掉


//-(CGFloat)tableView:(UITableView*)tableViewheightForFooterInSection:(NSInteger)section{
//
//return0;
//
//returnkAdjustRatio(92+10);
//}
//
//-(UIView*)tableView:(UITableView*)tableViewviewForFooterInSection:(NSInteger)section{
//*footerView=[tableViewdequeueReusableHeaderFooterViewWithIdentifier:@""];
//
//footerView.type=self.type;
//footerView.models=self.viewModel.datas[section];
//returnfooterView;
//}