移除单元格附件后,如何将微调器与单元格内容视图居中?
Posted
技术标签:
【中文标题】移除单元格附件后,如何将微调器与单元格内容视图居中?【英文标题】:How to center a spinner with cell content view after removing a cell accessory? 【发布时间】:2021-01-05 22:03:26 【问题描述】:我的故事板中有一个表格视图,其中原型单元格默认有一个披露指示器。 当我填充我的表格时,我只想从最后一个单元格中删除指示器并在其上居中放置一个微调器。 我是这样做的:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "CharacterCell", for: indexPath) as! CharacterCell
if indexPath.row == charactersViewModel.charactersCount - 1
cell.accessoryType = .none
cell.accessoryView = .none
// Spinner
let spinner = UIActivityIndicatorView(style: .large)
spinner.color = .white
spinner.center = cell.contentView.center
cell.contentView.addSubview(spinner)
spinner.startAnimating()
return cell
问题是微调器偏离中心,向左一点,就像配件仍然存在但隐藏一样。
我觉得我可能错过了表格单元格的生命周期,也许当附件仍然存在时它正在获取内容视图的中心值,所以当它被移除时它是偏离中心的?
我也尝试过 willDisplay 但同样的事情发生了。
有什么建议吗?
【问题讨论】:
你不应该在cellForRow
中添加子视图,因为它会在重复使用单元格时引起问题。我认为更好的方法是对最后一行使用不同的单元格子类,即已经有微调器但没有显示附件的单元格子类。
@Paulw11 好的,我不知道。我会调查的。朋友!
【参考方案1】:
正如@Paulw11 提到的,我使用了第二个子类并在我的表格视图中创建了另一个单元格原型。
然后当到达桌子的最后一个位置时,我们可以使用 cellForRowAt 上的第二个原型。
是这样的:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if indexPath.row >= charactersViewModel.charactersCount - 1
reloadRows(indexPath: indexPath)
let cell = tableView.dequeueReusableCell(withIdentifier: "LoadingCharacterCell", for: indexPath) as! LoadingCharacterCell
cell.startSpinner()
return cell
else
let cell = tableView.dequeueReusableCell(withIdentifier: "CharacterCell", for: indexPath) as! CharacterCell
cell.configureCell(charactersViewModel: charactersViewModel, cell: cell, index: indexPath.row)
return cell
private func reloadRows(indexPath: IndexPath)
var indexPathList = [IndexPath]()
indexPathList.append(indexPath)
charactersTableView.reloadRows(at: indexPathList, with: .automatic)
并且使用 reloadRows 函数,当表格接收到更多数据时,最后一个单元格会被更新和删除。
【讨论】:
以上是关于移除单元格附件后,如何将微调器与单元格内容视图居中?的主要内容,如果未能解决你的问题,请参考以下文章