iOS 15 TableView sectionHeaderTopPadding 统一 处理

//只需要在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 

你可能感兴趣的:(iOS 15 TableView sectionHeaderTopPadding 统一 处理)