UITableViewHeaderFooterView
问题背景
最近遇到了一个需要滚动的时候显示三种cell的需求
最普通的思路是注册三种cell,然后分别在tableView(_tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 中根据条件,获取到需要重用的cell
然而,仔细观察之后,发现有两种cell样式相同,第三种cell只是起说明的作用,于是乎我想到了第二种方法,注册一种cell,根据条件不同,分别展示两种常用cell的样式,而第三种cell则作为某个section的fotter出现
方案已定,代码自然嗖嗖的开始写了,其中关于fotterView,我是这么写的
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
letfotterView =UIView(frame:UIScreen.main.bounds)
returnfotterView
}
footerView的演示看上去好像没什么问题,然而,我的section:2 row:0是居于屏幕底部的(出于某种原因,我并没有勾选设置中safeArea layout Guide选项) 当我将列表向上滑动的时候,footerView停留在SafeAreaLayoutTop的位置,这么高级的特性,我也没见过啊,怎么才能去掉呢。没办法 看文档吧。于是 有了今天的发现
问题1
在官方文档中UITableView的Recycling Section Headers and Footers部分提供了三个方法1. - registerNib:forHeaderFooterViewReuseIdentifier:
registerClass:forHeaderFooterViewReuseIdentifier:
dequeueReusableHeaderFooterViewWithIdentifier:
瞬间发现,原来header和footer也是需要按照cell的三板斧来重用的
之前的写法会导致每次都新生成一个footer。导致不必要的性能损失
于是我将代码改成了
guard let fotterView = tableView.dequeueReusableHeaderFooterView(withIdentifier:"footer") else {
returnUIView(frame:UIScreen.main.bounds)
}
returnfotterView
问题2
footerView依旧在滑动的时候停留在safeArea处,官方文档指出一共有两种样式,plain不行,那就换成Grouped试试
于是我将tableView的style 设置为Grouped,发现footer View不停留在safeArea了,事情这么顺利😄,然而,这一改动,造成了新的问题,各个section之间出现了空白的间距
于是在attribute Inspector中查找原因
attribute Inspector我试图将Header Height 和 Footer Height设置为0来解决问题, 但是这两个属性都只能是正整数
怎么办呢, 那就让 内容超出 cell 实现内容不间断就好了
于是 cell.clipsToBounds = false
问题得到解决
问题3
我的UITableView有背景色,这导致在拉到最后的时候,会漏出背景色, 这怎么办
同样 在attribute Inspector中
attribute Inspector在这其中根据需要进行选择就好
这样,三个问题就都解决了,总结下,有时候,不遇到点问题,还不知自己有多菜。