UIScrollView内嵌禁用滚动UITableView时Autolayout约束报错问题
问题原因
你遇到的约束报错本质是 UIScrollView的自动布局规则和普通视图不同:UIScrollView的自身frame由父视图约束决定,但它的contentSize是由内部子视图(也就是你的内容容器视图)的约束撑开的,所以必须给内容容器视图明确的宽高约束,Xcode才能计算出UIScrollView的可滚动范围。
你当前的配置缺了两个关键配置:
- 内容容器视图的宽度没有和外层UIScrollView的宽度绑定,导致Xcode不知道滚动内容的宽度
- 禁用滚动的UITableView没有设置高度约束,无法撑开内容容器视图的高度,所以Xcode识别不到滚动内容的高度
解决步骤
第一步:修复UIScrollView和内容容器的基础约束
- 给UIScrollView设置上下左右约束,和父视图(主视图)除顶部固定头部外的区域完全贴合
- 给内容容器视图设置上下左右约束,全部贴到UIScrollView的
content layout guide上 - 给内容容器视图添加宽度约束,和UIScrollView的
frame layout guide的宽度相等,这样滚动内容宽度就和屏幕宽度一致,不会出现横向滚动,解决宽度报错问题
第二步:配置垂直方向的撑开逻辑
- 内容容器视图内部的三个元素(顶部说明Label、UITableView、底部说明Label)要依次设置垂直间距约束:顶部Label贴内容容器顶部,三个元素之间留固定间距,底部Label贴内容容器底部
- 给禁用了滚动的UITableView添加高度约束,高度值要和它自身的内容总高度相等:
- 如果你现在用的是固定高度的基础单元格,直接计算总高度:
40 * 单行行高,把这个值设为TableView高度约束的常量即可 - 后续适配动态高度单元格时,监听TableView的
contentSize变化,动态更新TableView的高度约束常量为tableView.contentSize.height即可,不需要硬编码数值
- 如果你现在用的是固定高度的基础单元格,直接计算总高度:
配置完成后,内容容器的高度会自动等于「顶部Label高度+间距+TableView高度+间距+底部Label高度」,Xcode就能正常计算出UIScrollView的contentSize,既不会报约束错误,外层ScrollView也能正常滚动展示全部内容。
内容的提问来源于stack exchange,提问作者Miguel
相关产品推荐
相关产品推荐

