hitTest解除键盘导致奇怪的行为

时间:2014-06-26 07:22:44

标签: ios keyboard hittest dismiss

我在Google上的UITableView中触摸了一个空白区域时,我搜索了如何解除键盘问题,并且有几种方法可以解决这个问题。就像使用委托,UITapGestureRecognizer,- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event一样。

我决定通过继承相应的UIView类来获取hitTest并覆盖此方法,如下所示:

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *result = [super hitTest:point withEvent:event];
    [self endEditing:YES];

    return result;
}

这确实有效,当我触摸/滚动/滑动/捏合......在其他地方时会解除虚拟键盘,但会出现另一个问题。

当我触摸一个UITextField对象时,键盘处于活动状态或显示,然后我触摸相同的UITextField对象,这是问题,键盘试图解除但不完全,在它开始出现的某个地方的中间,做这种奇怪的动画。在我们的APP中大多数情况下,当我们触摸相同的UITextField对象时,键盘应保持静止。有没有一种简单明了的方法来解决这个问题?

解决: 最后,我自己弄清楚了。感谢@Wain,感谢@Wain的暗示。在调用result之前,我会检查[self endEditing:YES];。这是修改后的代码:

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *result = [super hitTest:point withEvent:event];
    // You can change the following condition to meet your own needs
    if (![result isMemberOfClass:[UITextField class]] && ![result isMemberOfClass:[UITextView class]]) {
        [self endEditing:YES];
    }
    return result;
}

2 个答案:

答案 0 :(得分:0)

检查class的{​​{1}},以便在结束编辑时限制。如果命中目标是可编辑的类(如文本字段或开关),则不要结束编辑会话。

答案 1 :(得分:0)

根据@iBCode答案,如果我多次选择相同的文本字段,则键盘会自动隐藏并立即显示,以避免我又添加了一个条件并在下面的语言中添加了代码

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    if let resultView = super.hitTest(point, with: event) {
        if resultView.isMember(of: UITextField.self) ||
            resultView.isKind(of: UITextField.self) ||
            resultView.isMember(of: UITextView.self) ||
            resultView.isKind(of: UITextView.self) {
            return resultView
        }
        if !resultView.isMember(of: UITextField.self) && !resultView.isMember(of: UITextView.self) {
            endEditing(true)
        }
        return resultView
    }
    return nil
}