UITapGestureRecognizer 和自动校正

Posted

技术标签:

【中文标题】UITapGestureRecognizer 和自动校正【英文标题】:UITapGestureRecognizer and auto correction 【发布时间】:2011-10-15 05:31:11 【问题描述】:

我有以下代码:

- (void)viewDidLoad

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self 
                                    action:@selector(dismissKeyboard)];
    [self.view addGestureRecognizer:tap];
    tap.cancelsTouchesInView = NO;
    tap.delegate = self;
    [tap release];


-(void)dismissKeyboard 
    [self.textField resignFirstResponder];

textField 有一个 clearButton 并且启用了自动更正。当我点击 clearButton 时,一切正常,在UITextField 被清除后键盘仍然出现。但是,当我不想接受建议的自动更正时,键盘会消失,我的文本会被建议的替换。

我需要UITapGestureRecognizer,因为我在UITableView 中有UITextField,所以当用户在UITextField 之外点击时,我想退出键盘。

如何解决此问题,以便在用户需要且键盘仍处于活动状态时拒绝自动更正?为什么 clearButton 可以正常工作,而拒绝自动更正时不能正常工作?

编辑: 它可以与 clearButton 一起正常工作,因为它位于 UITextField 内。因此,手势不会被触发。但是当点击建议的文本更正时,它会被触发......有没有办法检查用户是否点击了建议的文本更正?

【问题讨论】:

【参考方案1】:

这是我为解决点击蓝色自动更正文本时的问题而实施的手势委托方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

    BOOL handleTouch = NO;
    UIView *v = [self.view hitTest:p withEvent:nil];
    Class autocorrectionCancelClass = NSClassFromString(@"UIAutocorrectInlinePrompt");
    if( ![v isKindOfClass:UIControl.class] && ![v isKindOfClass:autocorrectionCancelClass]  && ![v isDescendantOfView:currentlyEditedTextView] )
    
        handleTouch = YES;
    

    return handleTouch;

点击自动更正取消按钮后,v 是私有 SDK 类 UIAutocorrectInlinePrompt 的视图,但它也是编辑后的 ​​UITextField/UITtextView 的子视图。

编辑:检查类更好,因为对于UITextFieldUIAutocorrectInlinePrompt 视图不是该字段的后代(在 ios 4.3 和 5.0 上测试)。问题是这个类可以重命名为私有类。

【讨论】:

【参考方案2】:

kenji 的解决方案运行良好,但不包括 UIControl-s。 这是他的解决方案的更简洁的版本:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

    return ![touch.view isKindOfClass:NSClassFromString(@"UIAutocorrectInlinePrompt")];

【讨论】:

以上是关于UITapGestureRecognizer 和自动校正的主要内容,如果未能解决你的问题,请参考以下文章

使用 UITapGestureRecognizer 无法识别的选择器

UIlabel 中的 UITapGestureRecognizer 错误

UITapGestureRecognizer 的问题

带有点击事件的 UITapGestureRecognizer

UIButton 上的 UITapGestureRecognizer

为啥 UIButton 会覆盖 UITapGestureRecognizer?