Я пытаюсь создать пользовательский вид редактирования и анимацию для режима редактирования ячеек в моем UITableView, поэтому я создал собственный класс, добавил в него свои подпредставления и анимировал некоторые изменения кадра в setEditing (_: animated :) функция. Я также переопределяю функцию layoutSubviews (), где я также предоставляю новые значения кадра:
class TableViewCell: UITableViewCell {
override func layoutSubviews() {
self.deleteButtonView.frame.origin.x = self.viewPosition - 80
self.disclosureButtonView.frame.origin.x = self.contentView.bounds.width - (self.viewPosition / 2)
self.containerView.frame.origin.x = self.viewPosition
self.alarmImageNameView.alpha = self.viewAlpha
self.alarmImageDateView.alpha = self.viewAlpha
self.alarmSwitchView.alpha = self.viewAlpha
self.deleteButton.transform = self.buttonTransform
super.layoutSubviews()
}
override func setEditing(_ editing: Bool, animated: Bool) {
self.viewPosition = editing ? 80 : 0
self.viewAlpha = editing ? 0 : 1
self.buttonTransform = editing ? CGAffineTransform(rotationAngle: 90 * (.pi / 180)) : .identity
let layoutChanges = {
self.deleteButtonView.frame.origin.x = self.viewPosition - 80
self.disclosureButtonView.frame.origin.x = self.contentView.bounds.width - (self.viewPosition / 2)
self.containerView.frame.origin.x = self.viewPosition
self.alarmImageNameView.alpha = self.viewAlpha
self.alarmImageDateView.alpha = self.viewAlpha
self.alarmSwitchView.alpha = self.viewAlpha
self.deleteButton.transform = self.buttonTransform
}
if animated {
UIView.animate(withDuration: 0.5, delay: 0, options: [.curveEaseInOut], animations: layoutChanges, completion: nil)
} else {
layoutChanges()
}
super.setEditing(editing, animated: animated)
}
}
Это работает очень хорошо, даже когда я прокручиваю, но если я прокручиваю до самого низа, внезапно self.containerView
, кажется, игнорирует значение frame.origin.x, которое предоставила функция layoutSubviews (): YouTube-видео из анимации
Я не знаю, почему это не работает, если я устанавливаю точку останова в функции layoutSubviews (), она останавливается даже в последних ячейках, и если я распечатываю значение self.containerView.frame.origin.x
, это также правильно.
Редактировать :
Если это важно, здесь моя реализация cellForRowAtIndexPath:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let alarmProperties = self.alarms[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell
cell.delegate = self
cell.selectionStyle = .none
cell.alarmTimeLabel.text = "\(alarmProperties.hour):\(alarmProperties.minute)"
cell.alarmSwitch.isOn = alarmProperties.isActive
return cell
}