UITableView如何判断section footer是否完全可见并滚动使其完整展示
UITableView 没有提供和UICollectionView对应的layoutAttributesForSupplementaryElement API,但提供了直接获取指定section footer frame的系统方法rectForFooter(inSection:),基于这个API就可以复现你需要的全部功能。
实现代码
private func ensureSectionFooterIsVisibleIfPossible(_ section: Int) { // 校验section合法性,避免越界崩溃 guard section < tableView.numberOfSections else { return } // 获取指定section footer在tableView内容坐标系下的frame,等价于CollectionView中取layoutAttributes.frame的逻辑 let footerRect = tableView.rectForFooter(inSection: section) // 过滤未设置footer的场景(高度为0) guard footerRect.height > 0 else { return } // 计算当前tableView的可视内容区域 var visibleRect = CGRect() visibleRect.origin = tableView.contentOffset visibleRect.size = tableView.bounds.size // 检测footer是否完全在可视区域内 if !visibleRect.contains(footerRect) { // 执行滚动,系统自动计算偏移量保证footer完整展示 tableView.scrollRectToVisible(footerRect, animated: true) } }
补充说明
- 可见性检测逻辑:和UICollectionView的实现逻辑完全对齐,通过当前contentOffset和bounds计算可视区域,再用
contains方法判断footer是否完整落在可视区域内 - 如果你需要更精细的控制滚动位置,也可以沿用你之前手动计算contentOffset的逻辑,替换掉
scrollRectToVisible调用即可,计算规则和UICollectionView完全一致,iOS 11及以上可以用adjustedContentInset兼容安全边距的场景
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

