gpt4 book ai didi

ios - 选择单元格时奇怪的表格 View 行为

转载 作者:行者123 更新时间:2023-11-28 05:38:50 28 4
gpt4 key购买 nike

当一个单元格被选中时,我的表格 View 有一个奇怪的行为,但这种行为并不总是出现。选择一个单元格后,所选单元格下方的一些单元格会移动。这两个 gif 将向您展示显示和不显示两种情况下的行为。这是 tableview without weird behavior这是tableview with the weird behavior这是我的代码:

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell : UserTableViewCell = (tableView.dequeueReusableCell(withIdentifier: "userCell") as? UserTableViewCell)!
if(self.firebaseUsers.count != 0){
cell.influentBackgroudView.layer.cornerRadius=10
let url = URL.init(string: String().loadCorrectUrl(url:firebaseUsers[indexPath.row].image))
cell.influentImageView.contentMode = .scaleAspectFit
cell.influentImageView!.sd_setImage(with: url!, placeholderImage: UIImage.init(named: "placeholder"),options: [.continueInBackground,.progressiveDownload], completed: { (image, error, cacheType, imageURL) in
if (error != nil) {
cell.influentImageView!.image = UIImage(named: "placeholder")
} else {
cell.influentImageView.contentMode = .scaleAspectFill
cell.influentImageView.image = image
}

})
cell.influentImageView.layer.cornerRadius=10
cell.influentImageView.layer.masksToBounds = true
cell.influentNameLabel.text=" " + firebaseUsers[indexPath.row].name + " "
cell.influentNameLabel.adjustsFontSizeToFitWidth = true
cell.influentNameLabel.textAlignment = .center
if(selectedCellIndex==indexPath ){
cell.influentBackgroudView.isHidden=false
}
else{
cell.influentBackgroudView.isHidden=true
}
cell.selectionStyle = .none
}

return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let previousIndex=selectedCellIndex
selectedCellIndex=indexPath
if(previousIndex==selectedCellIndex){
let nextVC = storyboard?.instantiateViewController(withIdentifier: "VisitedProfileViewController") as! VisitedProfileViewController
nextVC.passedUser = firebaseUsers[selectedCellIndex!.row]
navigationController?.pushViewController(nextVC, animated: true)
}
if(previousIndex==nil){
tableView.reloadRows(at: [indexPath], with:.none)
}
else{
if(previousIndex != indexPath){
tableView.reloadRows(at: [indexPath,previousIndex!], with: .none)
}
else {
tableView.reloadRows(at: [indexPath], with: .none)

}
}
}

谢谢大家的帮助!

最佳答案

从评论中可以看出,您面临的问题是在您按下估计行高不正确的单元格时调用 reloadRows 产生的。因此,要么需要移除重新加载,要么需要更正估计高度。第一个解决方案已包含在 A. Amini 提供的答案中。

由于许多此类异常都与估计的行高有关,因此改进它仍然有意义。

对于简单的静态行高,您可以实现一个委托(delegate)方法,例如

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return indexPath.row == 0 ? 44.0 : 200.0
}

其中的值与您的 heightForRowAt 方法中的值完全相同。或者,如果所有行都具有相同的高度,您可以删除此委托(delegate)方法,但直接在某些初始化方法中设置高度,例如:

override func viewDidLoad() {
super.viewDidLoad()

tableView.rowHeight = 200
tableView.estimatedRowHeight = tableView.rowHeight
}

当引入更复杂的单元格并使用自动单元格高度时,我们通常使用单元格的高度缓存。这意味着我们需要在单元格消失时保存它的高度,以便我们以后可以使用它。所有高度都保存在 [IndexPath: CGFloat] 类型的字典中。一个非常简单的实现应该如下所示:

private var cellHeightCache: [IndexPath: CGFloat] = [IndexPath: CGFloat]()

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cellHeightCache[indexPath] = cell.bounds.height
}

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return cellHeightCache[indexPath] ?? UITableView.automaticDimension
}

在某些情况下,需要额外的工作,例如在重新加载 TableView 时清除缓存。

发生这种情况的原因是因为表格 View 不会重新加载您当前看到的单元格周围的单元格,而是检查内容偏移量并计算您应该看到的单元格。因此,由于错误的估计行高,任何重新加载的调用都可能使 TableView 跳转或为单元格设置动画。

关于ios - 选择单元格时奇怪的表格 View 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57673164/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com