Основная цель 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
        }
    }
}
Другие вопросы по тегам