обрабатывать метод touchesBegan для UITextField в UIScrollView

У меня есть ситуация, я должен обработать touchesBegan для текстового поля. Это текстовое поле находится в режиме прокрутки.

Я пробовал это до сих пор:

Я сделал подкласс UIScrollView

@interface CustomScrollView : UIScrollView
{
}
@end

@implementation CustomScrollView

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"good");
}

@end

Здесь я могу получить желаемый результат.

То же самое я реализовал с текстовыми полями. Я сделал подкласс UITextField:

@interface CustomTextField : UITextField
{
}
@end

@implementation CustomTextField

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"good");
}

@end

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

Пожалуйста, просветите меня в этом

(Я делаю это, чтобы добиться чего-то подобного, когда пользователь долго нажимает на текстовое поле, текст в текстовом поле назначается из текстового поля на метку, и пользователь может перетащить эту метку в другое место в представлении)


person Ankit Sachan    schedule 19.12.2009    source источник


Ответы (2)


По умолчанию UIScrollView откладывает отправку событий касания своим дочерним представлениям до тех пор, пока не сможет определить, должно ли касание вызвать прокрутку. Вы можете убедиться в этом, нажав и удерживая текстовое поле — touchesBegan сработает через мгновение.

Чтобы решить эту проблему, просто установите для свойства 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 и т. д.), но работает.

person Community    schedule 20.12.2009

Я также реализовал CustomUIScrollView как подкласс UIScrollView и перезаписал метод touchesBegan:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!self.dragging)
    {
        [self.nextResponder touchesBegan:touches withEvent:event];
    }
    else
    {
        [super touchesBegan:touches withEvent:event];
    }
}

В interfacebuilder я установил пользовательский класс объекта scrollview на CustomUIScrollView, а в части «Touch» я деактивировал касания с отменяемым содержимым. Теперь я мог бы использовать метод touchesBegan в ViewController моего UITextField, чтобы клавиатура исчезала при обнаружении прикосновения за пределами клавиатуры.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[event allTouches] anyObject];
    if ([myTextField isFirstResponder] && [touch view] != myTextField)
    {
        [myTextField resignFirstResponder];
    }
    [super touchesBegan:touches withEvent:event];
}
person Arne    schedule 06.10.2012