带横向UICollectionView的UITableView竖向滚动单元格半显问题求助
问题原因
- UITableView未开启分页属性:UITableView继承自UIScrollView,默认关闭分页功能,滚动停止位置没有对齐限制,自然会出现两个单元格各显示一半的情况。
- 行高代理方法签名错误:你写的
heightForRowAtIndexPath是Swift 3及更早版本的代理方法,Swift 4+的正确签名需要带外部参数下划线_,如果方法签名不匹配,系统不会调用该方法,单元格会使用默认行高而非你预期的全屏高度。
- 行高代理方法签名错误:你写的
- 行高获取时机不稳定:在代理方法中直接获取
myTableView.frame.size.height时,如果此时界面还未完成布局(比如视图刚加载阶段),拿到的是xib/Storyboard中的初始frame值,不是最终渲染在屏幕上的实际高度,导致行高不符合预期。
- 行高获取时机不稳定:在代理方法中直接获取
- 系统自动调整滚动偏移:iOS默认会给导航栏/标签栏下的滚动视图自动添加顶部/底部内边距,导致UITableView的可滚动区域和单元格高度不匹配,滚动后无法对齐。
解决方案
- 开启UITableView分页属性,在viewDidLoad中添加以下配置:
// 开启竖直分页滚动,滚动后自动对齐整行 myTableView.isPagingEnabled = true // 取消单元格分割线,避免视觉间隙 myTableView.separatorStyle = .none // 关闭系统自动添加的滚动内边距 if #available(iOS 11.0, *) { myTableView.contentInsetAdjustmentBehavior = .never } else { automaticallyAdjustsScrollViewInsets = false }
- 修正行高代理方法的签名,同时使用更稳定的屏幕高度作为行高:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { // 全屏高度直接取屏幕高度即可,如果有导航栏/底部安全区可对应减去对应高度 return UIScreen.main.bounds.height }
- 可选优化:修正TableViewCell内CollectionView的Item尺寸获取逻辑,避免横向滚动也出现半屏问题:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height) }
内容的提问来源于stack exchange,提问作者iron
相关产品推荐
相关产品推荐

