В моем проекте у меня есть 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, constant: 10),
longDescLabel.topAnchor.constraint(equalTo: topAnchor, constant: 20),
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
}
}
но есть проблема, когда пользователь нажимает на какую-либо ячейку и снова нажимает на нее (ячейка сначала становится большой, а затем становится маленькой) и прокручивает вниз (выбранная ячейка больше не отображается на экране), а затем прокручивает вверх, чтобы увидеть эту ячейку, высота ячейки мала, но отображаются длинные данные (вместо отображения коротких данных). почему это происходит и как решить эту проблему?
selectedRow
, еслиselectedCellIndexPath
. И значениеselectedRow
будетindexPath.row
. Надеюсь, это поможет. - person Faysal Ahmed   schedule 23.09.2020indexPath.row
. И в методе heightForRowAt вы можете проверить этот кодselectedRow == indexPath.row
- person Faysal Ahmed   schedule 23.09.2020