使用滑动手势(如在消息应用程序中)关闭键盘

36

当键盘出现在iPhone的信息应用程序上时,如果用户从消息tableview开始向下滑动并继续进入键盘区域,则键盘将开始消失。如果在此过程中他们上下移动手指,则键盘也会随之移动。

苹果是否使用私有API来实现此功能,或者是否有一种方式可以通过(我想)手势识别器来控制键盘?


它在我的iPhone上不会这样做。(3GS,iOS 4.3.3) - Mundi
啊,这可能在未来的操作系统发布中实现。我想讨论一下原则上如何实现这样的效果。 - Michael Stet
我相信这是iOS 5.x的一个功能。现在应该已经不受NDA限制了。 - Nicolas Miari
遗憾的是,这个功能在iOS 5.x中仍未出现。请查看我的答案,了解一个开源尝试。 - Daniel Amitay
@DanielAmitay 我找到了一个适用于iOS 7.1+的好方法 - ma11hew28
8个回答

44

3
太棒了!(有人需要接受这个答案) - Filipe Pina
啊啊啊,它在iOS 8中崩溃了。看来是时候让每个人找一个新的解决方案了! - chris stamper
这里有崩溃问题,是在swizzled_addSubview方法中。甚至不知道崩溃是如何发生的。 - Itesh
@MikeAlter 不,我已经放弃了。 - Can Poyrazoğlu
1
如果你还在寻找答案,那么请看mattdipasquale的解决方案,它是有效的。 - Prashant Tukadiya
显示剩余2条评论

34

2
这应该是被接受的答案。在iOS 7之后,你只需要使用keyboardDismissMode - Bill
我有一个包含textField的UIView。我该怎么做? - Gaby Fitcal
@GabyFitcal 没问题。请阅读以上所有链接。我已经更新它们。 - ma11hew28
1
tableView.keyboardDismissMode = .OnDragtableView.keyboardDismissMode = .OnDrag - Włodzimierz Woźniak

30

幸运的是,苹果在UIScrollView上添加了一个方便的属性keyboardDismissMode,让您的生活变得更加轻松。

现在,只需在故事板上更改单个属性或添加一行代码,您的应用程序就可以像Messages.app一样运行!

此属性使用新的UIScrollViewKeyboardDismissMode枚举。此枚举的可能值如下:

UIScrollViewKeyboardDismissModeNone        // the keyboard is not dismissed    automatically when scrolling
UIScrollViewKeyboardDismissModeOnDrag      // dismisses the keyboard when a drag begins
UIScrollViewKeyboardDismissModeInteractive // the keyboard follows the dragging touch off screen, and may be pulled upward again to cancel the dismiss

这是要更改的Storyboard属性,以在滚动时取消键盘:

enter image description here

希望这能帮助解决你的问题。


1
太好了。我很兴奋,只需要勾选一个框就可以了。然后意识到我的输入视图附在键盘顶部,但并没有随着它一起移动...哎呀。 - bandejapaisa

10

我的回答下面包含更多细节,而不提供未来可能更改的链接。 - Miguel Carvajal

5
你可以使用UISwipeGestureRecognizer来实现。我不知道如何使用代码实现,但如果你正在使用新的Xcode 4.2 beta,则有一种简单的方法:
1.创建一个IBAction: - (IBAction)dismiss:(id)sender;
  1. Go to your view in your xib and set the class for you view to UIControl.

  2. Drag and connect the UISwipeGestureRecognizer from the Library to your view.

  3. Connect the IBAction (TouchDown) with the UISwipeGestureRecognizer.

  4. Write the code to dismiss the keyboard:

    - (IBAction)dismiss:(id)sender 
    
    {
    
      [yourTextField resignFirstResponder];
    
    }
    

完成!


那样是行不通的。键盘会滑下并消失,但在手势完成之前手指再次向上移动时不会弹回来。 - Mundi
这是我所知道的唯一可以使用滑动手势关闭键盘的方法。只是想帮忙! - JonasG
同意JonasG的观点。尽管苹果可能在幕后使用了UIPanGestureRecognizer的某种形式,但它需要他们自己内部掌握控制键盘框架的知识,以使其以您在Messages.app中看到的方式上下滑动。最接近的方法是使用UISwipeGestureRecognizer(或者也许是UIPanGestureRecognizer,尽管它的作用与滑动几乎相同,在那里向下开始运动,并且没有办法阻止键盘在那一点消失)。 - john.k.doe

1
在Swift中,您可以使用以下代码获取当前键盘的视图容器(如果存在),然后可以在您的代码中更改其框架:

UIApplication.shared.windows
    .filter{ NSStringFromClass($0.classForCoder) == "UIRemoteKeyboardWindow" }
    .first?.subviews.filter { NSStringFromClass($0.classForCoder) == "UIInputSetContainerView" }
    .first?.subviews.filter { NSStringFromClass($0.classForCoder) == "UIInputSetHostView" }
    .first

顺便提一下,这里有一个叫做Reveal的工具,可以让您看到视图层次结构。


0

我认为最好的方法是在文本输入容器上方放置一个隐藏按钮。它可以是一个长条形状,当检测到触摸按下和释放或取消时,就会隐藏键盘。

我将尝试这种方法,并告诉你我的进展。


0

简短回答:他们很可能在使用一些“私有API”。

我非常确定键盘是在独立的视图中,位于您应用程序窗口之上(您无法访问/控制它,并且它始终显示在最上面,无论如何)。您能做的最多就是使输入视图成为/放弃第一响应者状态,键盘会相应地出现/消失:全有或全无。

您可能能够获取键盘视图的句柄并更改其框架属性(使用已记录类的未记录属性和未记录类),但我非常确定这将使您被从商店中踢出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接