He estado buscando una solución a este problema durante más de una semana. Te estoy respondiendo incluso si tu pregunta tiene más de un año esperando que esto ayude a otros.
Lo siento si mi lenguaje no es muy técnico, pero soy bastante nuevo en el desarrollo de Objective-C y iPhone.
Subclase UIpickerView es la forma correcta de hacerlo. Pero debes anular el método - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
. Este es el método que se invoca cada vez que toca la pantalla y devuelve la vista que reaccionará al tacto. En otras palabras, la vista cuyo método touchesBegan:withEvent:
se llamará.
¡El UIPickerView tiene 9 subvistas! En la implementación de la clase UIPickerView, - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
no devolverá self
(esto significa que no se llamará al touchesBegan:withEvent:
que escriba en la subclase) pero devolverá una subvista, exactamente la vista en el índice 4 (una subclase no documentada llamada UIPickerTable).
El truco es hacer que el método - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
para volver self
por lo que tienen control sobre los métodos touchesBegan:withEvent:
, touchesMoved:withEvent:
y touchesEnded:withEvent:
.
En estos métodos, para mantener las funcionalidades estándar de UIPickerView, DEBE recordar volver a llamarlas, pero en la subvista UIPickerTable.
Espero que esto tenga sentido. No puedo escribir código ahora, tan pronto como esté en casa, editaré esta respuesta y agregaré algún código.
gracias funcionó :) – ArunGJ
este código parece funcionar, excepto si se produce un toque en el marco que rodea inmediatamente la rueda selector. hacer eso parece causar un bucle infinito de llamadas al método getNextResponderView: withEvent: – pistachionut
ya lo evité devolviendo nil en lugar de hitTestView desde getNextResponderView: withEvent: si toqué la rueda circundante. – ArunGJ