UITableView 的 tableViewHeader 和 tableViewCells 重叠,直到调用 reloadData
Posted
技术标签:
【中文标题】UITableView 的 tableViewHeader 和 tableViewCells 重叠,直到调用 reloadData【英文标题】:UITableView's tableViewHeader and tableViewCells overlapping until reloadData is called 【发布时间】:2017-04-12 13:10:11 【问题描述】:我有一个表格视图,它有一个tableViewHeader
和一个充满单元格的部分。
在创建UITableView
之前,我创建了一个名为topSection
的视图,该视图的宽度和高度基于从我的API 返回的文本。
当我加载视图控制器时,由于 API 调用正在进行中,我可以很简单地看到 topSection
(即 UITableView.tableViewHeader
)坐在 UITableViewCells
后面。然后,当在我的didSet
中调用reloadData
来呈现表格视图时,一切都会正确布局。
在将 topSection
添加到 UITableView
之前,我不会以任何方式限制它
我还尝试将topSection
的top
限制为tableView
top
,但这也不起作用。
let listingsTableView = UITableView()
listingsTableView.backgroundColor = .white
listingsTableView.dataSource = self
listingsTableView.delegate = self
listingsTableView.rowHeight = 78
listingsTableView.bounces = false
listingsTableView.allowsSelection = false
listingsTableView.tableHeaderView = topSection
listingsTableView.register(ListingsHeaderView.self, forHeaderFooterViewReuseIdentifier: "HeaderView")
listingsTableView.register(ListingsTableViewCell.self, forCellReuseIdentifier: "ListingsCell")
view.addSubview(listingsTableView)
constrain(listingsTableView, topSection) tableview, topSection in
tableview.top == tableview.superview!.top
tableview.left == tableview.superview!.left
tableview.right == tableview.superview!.right
tableview.bottom == tableview.superview!.bottom
self.listingsTableView = listingsTableView
这里的任何帮助将不胜感激。谢谢!
【问题讨论】:
AFAIK,表视图标题的默认行为是在视图顶部。单元格在其下方滚动。如果您不希望这种行为,请不要将上述视图用作标题视图。分开 我相信你在想UITableViewHeaderFooterView
。例如,在“通讯录”应用程序中,它是带有“A”、“B”等的灰色条。 UITableView.tableViewHeader
是一个位于 UIScrollView 中所有部分之上的视图,它本质上是表格视图的一部分
【参考方案1】:
我认为您遇到了一个常见问题 - 表格不会在没有提示的情况下“自动调整”标题视图的大小。
尝试将此添加到您的代码中(您可能需要更改视图引用...):
override func viewDidLayoutSubviews()
super.viewDidLayoutSubviews()
sizeHeaderToFit()
func sizeHeaderToFit()
let headerView = theTableView.tableHeaderView!
headerView.setNeedsLayout()
headerView.layoutIfNeeded()
let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
var frame = headerView.frame
frame.size.height = height
headerView.frame = frame
theTableView.tableHeaderView = headerView
【讨论】:
感谢 DonMag!结果发生的一件小事是,我的 UILabel 的numberOfLines
属性等于 0、左边距和宽度不再换行,它只是从视图的左侧流出。似乎是这个的副作用
cl.ly/181p1D3a0X3J (在前面添加 https://,由于某种原因不允许我发布链接)。除了numberOfLines = 0
之外,它还有一个Title的left约束(“Nike”),一个Title的bottom + 4的top Constraint和一个superview.width * 80%的宽度
那是标题视图的一部分吗?还是一个单元格/行?您是否尝试过 Debug Hierarchy 来查看是否缺少任何约束或未正确计算?
它是tableViewHeader
的一部分。它只是视图中布置的另一个对象。我来看看 Debug Hierarchy
解决了。感谢您的帮助 DonMag以上是关于UITableView 的 tableViewHeader 和 tableViewCells 重叠,直到调用 reloadData的主要内容,如果未能解决你的问题,请参考以下文章
UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview
水平 UITableView 中的垂直 UITableView