Tôi đã tìm kiếm giải pháp cho vấn đề này trong hơn một tuần. Tôi trả lời bạn ngay cả khi bạn đang đặt câu hỏi là hơn một tuổi, hy vọng điều này sẽ giúp người khác.
Xin lỗi nếu ngôn ngữ của tôi không phải là rất kỹ thuật, nhưng tôi khá mới để phát triển Objective-C và iPhone.
Tạo lớp con UIpickerView là cách đúng để thực hiện. Nhưng bạn đã ghi đè phương thức - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
. Đây là phương pháp được gọi bất cứ khi nào bạn chạm vào màn hình và nó sẽ trả lại chế độ xem sẽ phản ứng với lần chạm. Nói cách khác, chế độ xem có phương thức touchesBegan:withEvent:
sẽ được gọi.
UIPickerView có 9 lượt xem phụ! Trong việc thực thi lớp UIPickerView, - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
sẽ không trả về self
(điều này có nghĩa là bạn sẽ không được gọi) touchesBegan:withEvent:
, nhưng sẽ trả về một khung nhìn con, chính xác khung nhìn ở chỉ mục 4 (một lớp con không được đặt tên là UIPickerTable).
Bí quyết là để làm cho phương pháp - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
trở self
vì vậy bạn có thể kiểm soát các touchesBegan:withEvent:
, touchesMoved:withEvent:
và touchesEnded:withEvent:
phương pháp.
Trong các phương pháp này, để giữ các chức năng tiêu chuẩn của UIPickerView, bạn PHẢI nhớ gọi lại chúng nhưng trên UIPickerTable subview.
Tôi hy vọng điều này có ý nghĩa. Tôi không thể viết mã ngay bây giờ, ngay khi tôi ở nhà, tôi sẽ chỉnh sửa câu trả lời này và thêm một số mã.
nhờ nó làm việc :) – ArunGJ
mã này dường như làm việc, trừ khi một liên lạc xảy ra trên khung đó ngay lập tức bao quanh bánh xe chọn. làm điều đó dường như gây ra một vòng lặp vô hạn các cuộc gọi đến phương thức getNextResponderView: withEvent:. – pistachionut
ya i ngăn chặn nó bằng cách trả về nil thay vì hitTestView từ getNextResponderView: withEvent: nếu tôi chạm vào bánh xe xung quanh. – ArunGJ