//只需要在AppDelegate中设置一次,不需要其他操作
if #available(iOS 15.0, *) {
UITableView.appearance().sectionHeaderTopPadding = 0
}
if (@available(iOS 15.0, *)) {
[UITableView appearance].sectionHeaderTopPadding = 0;
}
//老方法太复杂,可以摒弃,但是处理方法原理可以使用
- (void)setTableViewTopPadding{
if (@available(iOS 15.0, *)) {
if (self.tableViewTopPaddingIsSet == NO) {
self.tableViewTopPaddingIsSet = YES;
NSString *name = [NSString stringWithFormat:@"%s", object_getClassName([self class])];
//不知道具体是什么原因,Swift并没有受到影响,所以这儿有过滤,这儿是可有可无。
if ([name hasPrefix:@"#项目名称#."]) {
NSLog(@"Swift代码已经手动处理");
return;
}
unsigned int outCount = 0;
Ivar *ivars = class_copyIvarList([self class], &outCount);
for (unsigned int i = 0; i < outCount; i ++) {
Ivar ivar = ivars[i];
NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];
NSString *type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
NSLog(@"类型为 %@ 的 %@",type,name);
if ([type rangeOfString:@"UITableView"].location != NSNotFound) {
[self setValue:@(0) forKeyPath:[NSString stringWithFormat:@"%@.sectionHeaderTopPadding",name]];
break;
}
}
free(ivars);
}
}
}
备注:只能解决OC部分的问题,而且只是写在BaseViewctontroller里面的。
以防万一(没有写super),在viewWillAppear、viewWillLayoutSubviews、viewDidLayoutSubviews、viewDidAppear都进行调用,因为有判断,所以不必担心多次调用。
不要忘记引入
#import <objc/runtime.h>