【问题标题】:IOS/Objective-C: Detect Textfield touch but Exclude tap of underlying scrollviewIOS/Objective-C:检测文本字段触摸但排除底层滚动视图的点击
【发布时间】:2018-04-21 10:19:35
【问题描述】:

我有一个UIViewController,其中包含一个UIScrollView,它占据了整个VC,并且在UIScrollView 中包含了包括许多文本字段在内的各种元素。

我有一个关闭键盘的通用方法,如果您点击滚动视图上的任意位置,键盘将按如下方式关闭:

in viewdidload:

UITapGestureRecognizer *tapScroll = [[UITapGestureRecognizer alloc]initWithTarget:self 
action:@selector(tapped)];
    tapScroll.cancelsTouchesInView = NO;
    tapScroll.delegate = self;
    [self.scrollView addGestureRecognizer:tapScroll];

- (void) tapped
{
NSLog(@"tapped on scrollview");
    [self.view endEditing:YES];
}

问题在于,当您单击UITextField 时,有相当一部分时间会触发点击方法,因为对文本字段的点击也会注册为对底层滚动视图的点击。这样可以防止键盘出现,因此您无法在键盘中输入任何内容。 (我可以通过在 tapped 方法中注释掉 [self.view endEditing:YES]; 来防止这种行为)。

任何人都可以建议一种方法来检测文本字段触摸以显示键盘而不导致滚动视图识别点击,或者仅在触摸屏幕的空白部分时关闭键盘。

感谢您的任何建议。

【问题讨论】:

标签: ios objective-c uiscrollview uitextfield


【解决方案1】:

您可以使用以下方式检查点击来自哪个视图:

- (void)tapped:(UIGestureRecognizer *)gestureRecognizer{

   UIEvent *event = [[UIEvent alloc] init];
   CGPoint location = [gestureRecognizer locationInView:self.view];

   //Perform hit test
   UIView *view = [self.view hitTest:location withEvent:event];

   if ([view.gestureRecognizers containsObject:gestureRecognizer]) {

       //End Editing
       [self.view endEditing:YES];
   }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2016-09-13
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    相关资源
    最近更新 更多