Основная цель UIPanGestureRecognizer
У меня есть базовый класс, который обрабатывает некоторые основные анимации ячейки. В моем подклассе я переопределил цель распознавателя и хочу сделать кое-что еще, но перевод всегда 0
потому что я вызываю в базовом классе перевод сбрасывается на .zero
,
Есть ли способ, чтобы мой базовый класс мог выполнять базовую анимацию и использовать подкласс для переопределения метода и выполнения некоторых других вещей, как показано ниже?
У меня есть базовый класс:
class Base: UITableViewCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
let gesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
addGestureRecognizer(gesture)
}
func handlePan(recognizer: UIPanGestureRecognizer) {
if recognizer.state == .changed {
let translation = recognizer.translation(in: self)
...
recognizer.setTranslation(.zero, in: self)
}
}
}
И мой подкласс:
class Sub: Base {
override func handlePan(recognizer: UIPanGestureRecognizer) {
super.handlePan(recognizer: recognizer)
if recognizer.state == .changed {
let translation = recognizer.translation(in: self)
print(translation.x) // is always 0
recognizer.setTranslation(.zero, in: self)
}
}
}
1 ответ
Решение
В базовом классе вы могли бы разделить общую функциональность на другую функцию? Таким образом, вам не нужно вызывать super.handlePan:
class Base: UITableViewCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
let gesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
addGestureRecognizer(gesture)
}
func handlePan(recognizer: UIPanGestureRecognizer) {
if recognizer.state == .changed {
let translation = recognizer.translation(in: self)
performBaseAnimation(recognizer)
recognizer.setTranslation(.zero, in: self)
}
}
func performBaseAnimation(_ recognizer: UIPanGestureRecognizer) {
// perform common actions here
}
}
class Sub: Base {
override func handlePan(recognizer: UIPanGestureRecognizer) {
super.handleBaseAnimation(recognizer)
if recognizer.state == .changed {
// perform subclass actions here
}
}
}