it-swarm.com.ru

Как я могу ответить на сенсорные события в UITextField?

Я хочу отвечать на события касания (в частности, UIControlEventTouchUpInside и UIControlEventTouchUpOutside) на UITextField, но единственное событие, которое проходит, это UIControlEventTouchCancel.

Я не могу использовать UIControlEventEditingDidBegin, потому что это происходит только тогда, когда поле получает фокус, а это не то, что я пытаюсь обнаружить. Я хочу знать, когда пользователь поднимает палец и находится ли он внутри или снаружи текстового поля, независимо от текущего состояния фокуса.

Кто-нибудь знает способ сделать это?

Чтобы было ясно, я пытался использовать addTarget:action:forControlEvents, и это не работает. Событие исправления предотвращается отменой. Я хочу, чтобы был обнаружен способ исправления доUITextField использует его и генерирует событие Cancel.

Кроме того, я хотел бы избежать создания дополнительных представлений, если это возможно.

18
theK42

Весьма неплохо было бы создать UIButton с набором заливки для очистки, чтобы охватить все пространство, и UITextField поверх него. Если пользователь касается текстового поля, текстовое поле должно отправить событие, а если пользователь касается вне текстового поля, UIButton отправит событие.

4
brandonbocklund

Хороший ответ здесь: Изменить события касания по умолчанию для UITextField

Используйте делегат текстового поля и делайте то, что вы хотите сделать в textFieldShouldBeginEditing:

Вы можете вернуть NO, чтобы предотвратить поведение по умолчанию.

2
beev

Вы можете создать категорию для UiView и переопределить метод touchesBegan следующим образом.

Это работает нормально для меня. И это централизованное решение этой проблемы.

#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.window endEditing:true];
    [super touchesBegan:touches withEvent:event];
}


@end
1
Hiren

Я столкнулся с этой проблемой только сегодня. Моей целью было изменить цвет фона текстового поля при касании и вернуть его обратно при касании/отмене. Странно, что касание отправляется на цель из UITextField, но касание внутри, касание снаружи и даже отмена касания - нет. Я нашел решение. Это просто. Просто создайте подкласс UITextField и переопределите touchesEnded: и touchesCancelled :.

@interface TextField : UITextField

@end

@implementation CuteTextField

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesEnded:touches withEvent:event];
    self.backgroundColor=GetDefaultBackgroundColor();
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesCancelled:touches withEvent:event];
    self.backgroundColor=GetDefaultBackgroundColor();
}

@end
0
fnc12