обрабатывать метод touchesBegan для UITextField в UIScrollView - PullRequest
2 голосов
/ 19 декабря 2009

У меня есть ситуация здесь, я должен обработать 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

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

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

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

Ответы [ 2 ]

6 голосов
/ 20 декабря 2009

По умолчанию 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 и т. Д.), Но работает.

3 голосов
/ 06 октября 2012

Я также реализовал 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];
    }
}

В interface Builder я установил пользовательский класс объекта scrollview на CustomUIScrollView, а в части «Сенсорный» я деактивировал отмену касаний содержимого. Теперь я мог использовать метод 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...