为何UITableView.tableHeaderView属性修改高度仅接受非零值?设置0高度无效的原因探究
这是个很常见的UITableView布局坑,本质是苹果在UITableView内部做的特殊校验逻辑在起作用,我给你拆解清楚:
UITableView对高度为0的HeaderView的判定逻辑
苹果在UITableView的内部实现里,会对设置的tableHeaderView做有效性校验:如果这个view的frame高度为0,UITableView会直接忽略这个设置,相当于你根本没给它指定过headerView。这时候tableView会沿用默认的顶部间距规则(比如结合contentInset、sectionInset或者系统安全区的默认值),所以你看不到任何变化。CGFloat.leastNormalMagnitude的特殊之处
CGFloat.leastNormalMagnitude是CGFloat类型能表示的最小非零正数,它的值无限接近0,但严格来说不是0。当你把headerView的高度设为这个值时,UITableView会判定这个view是合法有效的,会将其纳入布局计算。因为这个高度极小,视觉上几乎和“没有headerView”完全一致,但却绕过了UITableView对高度为0的校验逻辑,从而达到了你想要的消除顶部间距的效果。补充一个小技巧
如果你一定要用高度为0的view,也可以在设置完tableView.tableHeaderView = UIView(frame: .zero)之后,手动触发tableView的布局更新,比如调用tableView.layoutIfNeeded()。不过这种方式偶尔会有兼容性问题,不如用CGFloat.leastNormalMagnitude来得稳定可靠。
内容的提问来源于stack exchange,提问作者JOONWOO LEE

