UITableView的style是UITableViewStyleGrouped

一般情况下,UITableViewStylePlain和UITableViewStyleGrouped是UITableView常用到的style,

之前都是用到的时候,遇到问题直接用度娘,差不多就够用了,今天在修复UI提出的间隙问题,来回改,总觉得没有改到命点。

下面是UI提出的要求:

我项目里的代码片段是这样的:

objectivec 复制代码
    self.tableView = [[UITableView alloc]initWithFrame:(CGRectZero) style:(UITableViewStyleGrouped)];
    [self.view addSubview:self.tableView];
    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.bottom.equalTo(@0);
        make.top.equalTo(@([UIDevice SafeAreaNaviHeight]));
    }];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    self.tableView.tag = 10000;
    self.extendedLayoutIncludesOpaqueBars = YES;
    if (@available(iOS 11.0, *)) {
        [self refreshStableTableView:self.tableView];
    } else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    self.automaticallyAdjustsScrollViewInsets = NO;
#pragma clang diagnostic pop
    }
    
    if (@available(iOS 15.0, *)) {//适配15之后headerHeight会默认22
        self.tableView.sectionHeaderTopPadding = 0;
    }
    
    self.tableView.contentInset = UIEdgeInsetsMake(7, 0, UIDevice.SafeAreaBottom +49, 0);
    self.view.backgroundColor = self.tableView.backgroundColor = [UIColor useLight:HexColor(blk_6) Dark:HexColor(d_blk_6)];
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

UITableView用的style是UITableViewStyleGrouped

也在代理里设置了:

objectivec 复制代码
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    return [UIView new];
}
//
- (UIView *)tableView:(UITableView *)tableView viewForFoooterInSection:(NSInteger)section{
    return [UIView new];
}
//
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return .01;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return .01;
}

感觉看着没有啥问题,所以来回试,第一次改的时候是动了个歪脑筋,

将tableView的contentInset硬生生的改了一下,看起来大概达到UI的要求了,可能可以骗过UI吧,但是骗不了自己,这个间距并不精确。

objectivec 复制代码
self.tableView.contentInset = UIEdgeInsetsMake(7, 0, UIDevice.SafeAreaBottom +49 - 7, 0);

一直没有往tableFooterView上想,那是因为我一直以为代理里的viewForFooterInSection和tableView的tableFooterView是一个东西。

查完之后,大致知道了这两的区别:

tableFooterView是整个tableView的footerView;

代理创建的是每个section的footerView。

UITableView的style是UITableViewStyleGrouped的时候,tableFooterView会有个默认的高度,需要给tableFooterView一个view来实现自己的需求;当设置

objectivec 复制代码
self.tableView.tableFooterView = [UIView new];

不起作用。因为系统检测到高度为0时,会使用默认高度。所以在我的项目里需要做如下设置才能精确符合UI的要求

objectivec 复制代码
self.tableView.tableFooterView = [[UIView alloc]initWithFrame:(CGRectMake(0, 0, SCREEN_WIDTH, 7))];

代理里的viewForFooterInSection,如果不设置的话,会有个默认的空白高度,想要去除,或者想要指定的高度,那需要自己去实现代理;

如果是要去掉每个section的高度则在DataSourse的heightForFooterInSection return 0.01 (不要return 0 ,不然会觉得没有设置高度,变成默认的高度)。为了保险起见同时在Delegate的viewForFooterInSection默认**return UIView new**确保高度设置为0.01成功这样就可以了。

tableHeaderView同理。

后期会把遇到的关于UITableView不同的style的不同设置也慢慢记录下来,方便自己理解,省的每次都是好像懂了,又好像还是啥也不懂。

相关推荐
一个人旅程~21 小时前
关于imac27inch因改短用户名导致混合硬盘和系统崩溃的问题分析与故障解决
经验分享·笔记·macos·新浪微博
volunteer102421 小时前
从仅剩 6 GB 到狂腾 70 GB:我的 256G Mac mini 深度清理与内存排查实战
macos
todoitbo2 天前
我在 Mac 上用 Docker 部署 Nexent:从拉取镜像到接入模型
macos·docker·大模型·ai智能体·nexent·快速入门与环境准备
独隅2 天前
WebStorm macOS 安装部署与高效调优实战指南
ide·macos·webstorm
fthux3 天前
Tick Rest,一个休息提醒工具的自我修养
macos·开源·swift
FPGA小迷弟4 天前
FPGA 与千兆以太网:各类物理接口的形式、区别、使用方法与应用场景详解
tcp/ip·macos·fpga开发·udp·fpga
2501_916008895 天前
iOS App 图标、启动屏和多语言搭配 方法,上架前使用KXBuild一次做好 App 图标
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_915918415 天前
iOS 推送通知怎么实现,从 APNs p8 密钥到 iOS 真机收到第一条推送
vscode·ios·objective-c·个人开发·swift·敏捷流程
周小董6 天前
[1379]mac安装nvm
macos
bossjuemfc6 天前
不记得文件名时,Mac 上的搜索还能怎么做?
macos