Определить, когда UIPickerView начинает меняться / двигаться

Я пытаюсь отреагировать на событие, которое UIPickerView начал двигаться (не тогда, когда строка уже была выбрана).

Я искал методы делегата, и ни один из них не помог. Я также попытался зарегистрировать уведомление, но не смог найти ни одного, который бы уведомлял, когда пользователь кладет палец на компонент и начинает прокручивать.

Есть идеи, какие есть альтернативы?

1 ответ

Решение

Вы можете создать собственный класс UIPickerView и переопределить hitTest(point:with:), Создавая протокол, вы можете отправить текущий сборщик с помощью метода делегата вашему контроллеру и нарисовать все, что захотите:

protocol CustomPickerViewDelegate {
    func didTapped(_ picker: CustomPickerView)
}

class CustomPickerView: UIPickerView {

    var myDelegate: CustomPickerViewDelegate?

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        // Only test for points in your needed view
        if !self.point(inside: point, with: event) {
            return nil
        }

        // Return using CustomPickerViewDelegate the current picker
        // that can be used to determine which one was selected
        myDelegate?.didTapped(self)

        // Call super.hitTest(_: with:)
        return super.hitTest(point, with: event)
    }
}

НЕ забывайте (в вашем контроллере: например. YourViewController):

self.pickerView.myDelegate = self,

Создайте расширение вашего контроллера, на который подписывается CustomPickerViewDelegate протокол:

extension YourViewController: CustomPickerViewDelegate {
    func didTapped(_ picker: CustomPickerView) {
        // do what you want here
        self.addBorderTo(picker: picker)
    }
}

Если вам нравится, вы можете продлить UIPickerViewDelegate (см. ниже, как вы можете расширить делегат базового класса)

Расширение делегата из базового класса

Удачи:]

Другие вопросы по тегам