【问题标题】:iPhone: dismiss keyboard when user touches backgroundiPhone:当用户触摸背景时关闭键盘
【发布时间】:2011-05-16 20:29:56
【问题描述】:

我已经阅读了一些其他文章,例如 herehere,但不幸的是,我的代码中存在一些差异,无法使这些工作正常工作(所以请不要建议这些答案)。

我想在用户点击背景时关闭键盘。通常这很容易,除了我的UITextField 对象位于UIScrollView 内,这使得我无法捕捉到触摸事件(UIScrollView 将它们吞没,因此它们不会到达基本视图)。解决此问题的一种方法是注册通用手势(点击),但这会捕获所有点击,包括用于提交按钮的点击。

所以基本上,'touchesBegan:withEvent:' 不会起作用,因为它永远不会被调用,手势也不会起作用,因为它们不考虑按钮按下。

问题来了:有什么方法可以检测到对UIScrollView 的简单点击?一旦我检测到水龙头,我就知道该怎么做。谢谢!

【问题讨论】:

    标签: iphone objective-c cocoa-touch first-responder


    【解决方案1】:

    你不能在滚动视图的父视图上使用touchesBegan:withEvent,但是子类化 UIScrollView 并在那里处理触摸呢?然后,您可以正常调用 super 的实现,以免踩到 UIScrollView 的脚趾:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        /* Insert code to dismiss keyboard if needed */
    
        // This makes sure scrolling proceeds normally.
        [super touchesBegain:touches withEvent:event];
    }
    

    【讨论】:

    • 那么,如果用户只点击屏幕,touches 的大小会是 1 吗?另外,这会干扰 ScrollView 中的按钮吗?
    • 一般的理论是每次手指触摸屏幕时都会调用该事件。由于理论上两个手指恰好同时触摸屏幕是可能的,因此触摸作为一组传递。实际上,触摸几乎总是只有一次触摸,并且对于多个手指的触摸,消息的发送时间非常接近。至于按钮,它们将在响应者链中具有更高的优先级,我相信它们会在滚动视图不知道的情况下消耗自己的触摸。
    • 你太棒了,谢谢。那么你对如何区分触摸和滚动有什么想法吗?
    • @mtmurdock:为了在用户实际尝试滚动时不关闭键盘?
    • 基本上是的。我实际上实现了它只是检查[touches count] == 1 是否工作得很好。感谢您的帮助!
    【解决方案2】:

    我也遇到了同样的问题。在 IOS 6.0 中,它运行良好,但当我切换到 IOS 5.0 时,它开始显示与您提到的相同的行为。

    IOS 5.0 锻炼 - 您应该使用 UITapGestureRecognizer。然后将其委托设置为 self 并实现以下委托方法

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

    作为

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        return ! ([touch.view isKindOfClass:[UIControl class]]);
    }
    @end
    

    上面的代码会验证被触摸的对象不是UIButton或者任何控制元素,然后只处理触摸

    希望它能解决你的问题。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多