如何解决当用户选择或取消选择自定义UITableViewCell高度时,如何更改它?
在我的项目中,我有一个UITableView
,每次用户点击任意一个单元格时,该单元格的高度都会随着在单元格内显示一些长文本而增加,而再次点击或点击另一个单元格时,该单元格的高度会降低并显示一些简短的文字。(带有动画)
class SomeCustomCell: UITableViewCell {
static let identifier = "SomeCustomCellId"
var shortDescLabel: AvatarLabel!
var longDescLabel: AvatarLabel!
override func setSelected(_ selected: Bool,animated: Bool) {
super.setSelected(selected,animated: animated)
backgroundColor = selected ? UIColor.lightGray.withAlphaComponent(0.5) : .clear
if selected {
didSelected()
} else {
deselected()
}
}
override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?) {
super.init(style: style,reuseIdentifier: reuseIdentifier)
selectionStyle = .none
shortDescLabel = AvatarLabel()
shortDescLabel.translatesAutoresizingMaskIntoConstraints = false
addSubview(shortDescLabel)
NSLayoutConstraint.activate([
shortDescLabel.leadingAnchor.constraint(equalTo: leadingAnchor,constant: 10),shortDescLabel.topAnchor.constraint(equalTo: topAnchor,constant: 20),shortDescLabel.heightAnchor.constraint(equalToConstant: 50),shortDescLabel.trailingAnchor.constraint(equalTo: trailingAnchor,constant: -10)
])
longDescLabel = AvatarLabel()
longDescLabel.alpha = 0.0
longDescLabel.numberOfLines = 0
longdateLabel.isHidden = true
longDescLabel.translatesAutoresizingMaskIntoConstraints = false
addSubview(longDescLabel)
NSLayoutConstraint.activate([
longDescLabel.leadingAnchor.constraint(equalTo: leadingAnchor,longDescLabel.topAnchor.constraint(equalTo: topAnchor,longDescLabel.heightAnchor.constraint(equalToConstant: 100),longDescLabel.trailingAnchor.constraint(equalTo: trailingAnchor,constant: -10)
])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func didSelected() {
longDescLabel.isHidden = false
shortDescLabel.isHidden = true
UIView.animate(withDuration: 0.5) { [weak self] in
self?.shortDescLabel.alpha = 0.0
self?.longDescLabel.alpha = 1.0
}
}
func deselected() {
longDescLabel.isHidden = true
shortDescLabel.isHidden = false
backgroundColor = .clear
UIView.animate(withDuration: 0.5) { [weak self] in
self?.shortDescLabel.alpha = 1.0
self?.longDescLabel.alpha = 0.0
}
}
func setSomeCustomCell(_ someModel: SomeModel) {
shortDescLabel.text = someModel.shortText
longDescLabel.text = someModel.longText
}
}
这是我的UITableView
代码:
extension someViewController: UITableViewDelegate,UITableViewDataSource {
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
if someModels.count == 0 {
tableView.setEmptyView()
} else {
tableView.restore()
}
return someModels.count
}
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: SomeCustomCell.identifier) as? SomeCustomCell else {
return SomeCustomCell()
}
let item = someModels[indexPath.row]
cell. setSomeCustomCell(item)
return cell
}
func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath) {
if selectedCellIndexPath == indexPath {
self.selectedCellIndexPath = nil
guard let cell = tableView.cellForRow(at: indexPath) as? SomeCustomCell else { return }
cell.deselected()
} else {
self.selectedCellIndexPath = indexPath
}
tableView.beginUpdates()
tableView.endUpdates()
if selectedCellIndexPath != nil {
// This ensures,that the cell is fully visible once expanded
tableView.scrollToRow(at: indexPath,at: .none,animated: true)
}
}
func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat {
if selectedCellIndexPath == indexPath {
return 140
}
return 90
}
}
但是有一个问题,当用户点击某个单元格并再次点击它时(单元格先变大然后变小)然后向下滚动(所选单元格现在不再显示在屏幕上),然后向上滚动以查看该单元格的高度很小,但是显示的是长数据(而不是显示短数据)。为什么会发生这种情况以及如何解决此问题?
解决方法
调用自己的函数来更改单元格“已选择/未选择”的外观确实会 否 通知表格更改。
使用当前代码,当您第二次在某个单元格上点击时,您正在告诉该单元格更改其外观,但据表视图所知,该单元格仍处于选中状态。 。 / p>
因此,当您向下滚动然后又向上备份时,表视图将自动“重新选择”该行。
将您的didSelectRowAt
更改为此:
func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath) {
if selectedCellIndexPath == indexPath {
self.selectedCellIndexPath = nil
// tell the table view to deselect the row!
tableView.deselectRow(at: indexPath,animated: true)
//guard let cell = tableView.cellForRow(at: indexPath) as? SomeCustomCell else { return }
//cell.deSelected()
} else {
self.selectedCellIndexPath = indexPath
}
tableView.beginUpdates()
tableView.endUpdates()
if selectedCellIndexPath != nil {
// This ensures,that the cell is fully visible once expanded
tableView.scrollToRow(at: indexPath,at: .none,animated: true)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。