gpt4 book ai didi

ios - 每次点击单元格时都会运行 layoutSubviews()

转载 作者:行者123 更新时间:2023-11-28 11:31:53 27 4
gpt4 key购买 nike

我正在用 Swift 开发一个 iOS 应用程序,我有一个带有自定义 UITableViewCellsUITableView,通过覆盖 在单元格的左侧和右侧有间距layoutSubviews().

这通过将 40 减去 self.bounds.size.width 来实现。

由于我不太擅长解释,这里有一张图片:

image of my app

但问题是,当我点击一个单元格时,覆盖的 layoutSubviews() 函数再次运行,因此单元格再次缩小,因为它再次减去 40 到 already 原始 self.bounds.size.width - 40

shrunken UITableViewCell

如何避免 layoutSubviews() 在每次单击单元格时运行,并使其仅在加载 View 时运行一次?

我不知道为什么 layoutSubviews 再次运行,因为它已加载到我的自定义 UITableViewCell 类中。

这是我的代码:

class TBRepoTableViewCell: UITableViewCell {
@IBOutlet weak var repoLabel: UILabel!
@IBOutlet weak var urlLabel: UILabel!
@IBOutlet weak var repoIcon: UIImageView!

override func layoutSubviews() {
// Set the width of the cell
self.bounds = CGRect(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width - 40, self.bounds.size.height)
super.layoutSubviews()
}
}

class SourcesViewController: UITableViewController {
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// note that indexPath.section is used rather than indexPath.row
print("You tapped cell number \(indexPath.row).")
}

override func viewWillAppear(_ animated: Bool) {
setEditing(false, animated: true)
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TBRepoTableViewCell
let repoArray = array[indexPath.row]
cell.repoLabel.text = repoArray.repoName
cell.urlLabel.text = repoArray.repoURL
cell.repoIcon.image = repoArray.icon

self.tableView.separatorStyle = .none

// add borders
cell.layer.cornerRadius = 10
cell.clipsToBounds = true
cell.layer.masksToBounds = true

return cell
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
array.remove(at: indexPath.row)
tableView.reloadData()
}
}

override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
tableView.reloadData()
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return array.count
}
}

最佳答案

切勿在 layoutSubviews 中修改 View 的框架或边界。您唯一应该做的就是根据 View 的当前大小更新 View subview 的框架或边界。

您应该做的是修改单元格 View 类,使其具有显示缩进和圆角的 View 。我们称其为“背景 View ”。将单元格的其他 subview 添加到此背景 View 。然后将背景 View 添加到单元格的 contentView。

您的cellForRowAt 不应更改单元格的层。该逻辑属于自定义单元类。

关于ios - 每次点击单元格时都会运行 layoutSubviews(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56484674/

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