Balayez les gestes à gauche sur UITextField

J'ai UITextFields dans tableviewcells. Lorsque vous balayez la cellule qui ne fait pas partie du champ de text, l'action de suppression apparaît comme prévu. Si vous faites défiler le champ de text, la suppression disparaît.

Comment puis-je résoudre ce problème afin que vous puissiez balayer les inputs et que la cellule triggers l'action de suppression?

Je pense que le problème ici est que le toucher sur le champ de text interfère avec votre reconnaissance de mouvement de balayage (vraisemblablement attaché à la vue des parents). J'ai eu un problème similaire avec un champ de text qui a été placé dans un UIScrollView.

J'ai contourné ce problème en superposant un UIView clair sur mon UITextField. J'ai alors assigné un UITapGestureRecognizer à cette vue claire pour placer le champ de text en tant que premier répondeur quand l'user tape sur le champ. Sinon, le balayage est envoyé à la vue parent (une vue déroulante) qui reconnaît le balayage sans aucun problème. C'est un peu boiteux mais ça fonctionne.

Ce scénario est un peu différent du vôtre, mais je pense que c'est le même problème. Voici à quoi ressemble mon code, j'espère que ça aide:

// UIView subclass header @interface LSAddPageView : UIView @property (weak, nonatomic) IBOutlet UITextField *textField; // Connected to the UITextField in question @property (strong, nonatomic) UIView *textFieldMask; @property (assign, nonatomic) BOOL textFieldMaskEnabled; @end // UIView subclass implementation @implementation LSAddPageView - (void)awakeFromNib { [super awakeFromNib]; _textFieldMask = [UIView new]; _textFieldMask.backgroundColor = [UIColor clearColor]; [self insertSubview:_textFieldMask aboveSubview:self.textField]; } - (void)layoutSubviews { [super layoutSubviews]; _textFieldMask.frame = self.textField.frame; } - (BOOL)textFieldMaskEnabled { return _textFieldMask.hidden == NO; } - (void)setTextFieldMaskEnabled:(BOOL)textFieldMaskEnabled { _textFieldMask.hidden = !textFieldMaskEnabled; } @end 

Et puis dans le controller:

 - (void)viewDidLoad { [super viewDidLoad]; _addPageView = (LSAddPageView*)self.view; _maskGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapMask:)]; _maskGestureRecognizer.numberOfTapsRequired = 1; _maskGestureRecognizer.numberOfTouchesRequired = 1; [_addPageView.textFieldMask addGestureRecognizer:_maskGestureRecognizer]; self.textField.delegate = self; // Set delegate to be notified when text field resigns first responder } - (void)didTapMask:(UIGestureRecognizer*)recognizer { _addPageView.textFieldMaskEnabled = NO; [self.textField becomeFirstResponder]; } - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { _addPageView.textFieldMaskEnabled = YES; return YES; } 

à partir de UIButton & UITextField bloquera UITableViewCell en cours de balayage pour supprimer

 self.tableView.panGestureRecognizer.delaysTouchesBegan = YES; 

cela fera le champ de text ne pas arrêter les invités de gauche

Il semble que vous deviez définir la propriété cancelsTouchesInView

 yourGestureRecognizer.cancelsTouchesInView = NO;