Я искал решение этой проблемы более недели. Я отвечаю вам, даже если ваш вопрос старше года, надеясь, что это поможет другим.
Извините, если мой язык не очень технический, но я довольно новичок в разработке Objective-C и iPhone.
Создание подклассов UIpickerView - верный способ сделать это. Но вы должны переопределить метод - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
. Этот метод вызывается всякий раз, когда вы касаетесь экрана, и он возвращает вид, который будет реагировать на касание. Другими словами, представление, для которого будет вызван метод touchesBegan:withEvent:
.
UIPickerView имеет 9 подпредставлений! В реализации класса UIPickerView - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
не вернет self
(это означает, что touchesBegan:withEvent:
, который вы пишете в подклассе, не будет вызван), но вернет подпредставление, в точности представление по индексу 4 (недокументированный подкласс называется UIPickerTable).
Хитрость в том, чтобы заставить метод - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
возвращать self
, чтобы у вас был контроль над методами touchesBegan:withEvent:
, touchesMoved:withEvent:
и touchesEnded:withEvent:
.
В этих методах, чтобы сохранить стандартные функциональные возможности UIPickerView, вы ДОЛЖНЫ не забывать вызывать их снова, но в подпредставлении UIPickerTable.
Надеюсь, это имеет смысл. Я не могу сейчас написать код, как только я дома, я отредактирую этот ответ и добавлю немного кода.