По умолчанию UIScrollView задерживает отправку событий касания в свои дочерние представления, пока не может определить, должно ли касание вызывать прокрутку. Вы можете доказать это, нажав и удерживая текстовое поле - прикосновения Began сработает через мгновение.
Чтобы решить эту проблему, просто установите для свойства delaysContentTouches своего пользовательского представления прокрутки значение NO. Это можно сделать через Interface Builder, сняв флажок «Задержка касания содержимого». В коде просто сделайте что-то похожее на следующее:
_myCustomScrollView.delaysContentTouches = NO;
Метод touchesBegan вашего CustomTextField теперь срабатывает немедленно. Имейте в виду, однако, что пользователи больше не смогут прокручивать в CustomScrollView, если их начальное нажатие находится внутри какого-либо подпредставления. Если для параметра delaysContentTouches установлено значение no, попробуйте нажать внутри своего текстового поля (или любого другого подпредставления) и пролистать - вы увидите, что прокрутка не происходит. Если для параметра delayContentTouches установлено значение yes, пользователь может касаться и проводить пальцем из любой точки в пределах CustomScrollView и запускать его прокрутку.
Если вы хотите получить лучшее из обоих миров (пользователи могут прокручивать из любого места и подпредставления, которые могут реагировать на прикосновения), вы переопределяете метод hitTest в своем CustomScrollView и отправляете сообщение подпрошившему подпредставлению. Вот реализация в CustomScrollView:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent*)event {
UIView *hitView = [super hitTest:point withEvent:event];
if([hitView class] == [CustomTextField class]) {
[(CustomTextField *) hitView handleTap:point];
}
return hitView;
}
А вот реализация CustomTextField:
@interface CustomTextField : UITextField {
}
-(void) handleTap:(CGPoint) point;
@end
@implementation CustomTextField
-(void) handleTap:(CGPoint) point {
// Implement your handling code here
}
@end
Это хак в том смысле, что он не совсем обрабатывает прикосновения (touchesBegan, touchesEnded и т. Д.), Но работает.