2011-08-20 97 views
27

当iPhone的Messages应用程序显示键盘时,如果用户从消息tableview开始向下滑动并继续进入键盘区域,键盘将开始关闭。如果他们在此过程中上下移动手指,则键盘会随之移动。以滑动手势关闭键盘(如在消息应用程序中)

苹果是用私有API来做这件事,还是有办法像这样控制键盘(我认为)手势识别器?

+0

它不会在我的iPhone上这样做。 (3GS,iOS 4.3.3) – Mundi

+0

啊,这可能假设在未来的OS版本中。原则上,我想讨论如何获得这样的效果。 –

+0

我相信这是一个iOS 5.x功能。现在应该退出NDA。 –

回答

6

您可以使用UISwipeGestureRecognizer来执行此操作。我不知道如何使用代码来实现它,但如果您使用的是新的Xcode 4.2测试版,然后下面有一个简单的方法:

  1. 创建一个IBAction为:

- (IBAction)dismiss:(id)sender;

  1. 在你的xib中转到你的视图,并为你查看UIControl。

  2. 将UISwipeGestureRecognizer从库中拖放到视图中。

  3. 将IBAction(TouchDown)连接到UISwipeGestureRecognizer。

  4. 编写代码以关闭键盘:

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

完成!

+0

这是行不通的。键盘会滑落并消失,但在手势完成之前手指再次向上移动时不会再回来。 – Mundi

+0

那么,这是唯一的方法,以解雇一个我知道的滑动手势的键盘。只是想帮忙! – JonasG

+0

同意JonasG。而Apple可能使用的是一种UIPanGestureRecognizer,它需要他们自己的内部知识来控制键盘的框架,使其以Messages.app中的方式上下滑动。最接近的是使用UISwipeGestureRecognizer(或者UIPanGestureRecognizer,尽管它的行为几乎与滑动相同,因为下来会开始运动,并且没有办法阻止键盘在此时消失)。 –

0

我认为最好的方法是在文本输入容器上放置一个隐藏的按钮。一个长条,当它检测到触地和释放或取消,然后隐藏键盘。

我要试一下,我会让你知道我是怎么去的。

0

简答题;他们很可能在那里做一些'私人API'的事情。

我很确定键盘是在独立视图中,位于您的应用程序窗口之上(您无权访问/控制它,并始终显示在顶部,无论如何)。您可以做的最多的是让输入视图成为/退出第一响应者状态,并且键盘将相应地出现/消失:全部或全部。

您可能能够获取键盘视图的句柄并更改其框架属性(使用记录的类的未记录属性以及未记录的类),但我相当肯定会让您退出存储。

44

我创建了一个UIView的类别提供所需的功能:

https://github.com/danielamitay/DAKeyboardControl

编辑: 确实已经在App Store中。

+3

简直太棒了!(_someone_需要接受这个作为答案) –

+0

优秀,你应该有超过10个upvotes的东西! –

+0

真棒真棒真棒..... –

10

在iOS 7中,您现在可以在UIScrollView上交互式地关闭键盘。

Dismissing the keyboard in a UIScrollView

希望帮助别人。

+0

我的回答包含以下无需提供链接,有可能在未来 –

27
+2

这种改变应该是公认的答案更多细节。在iOS 7之后,所有你需要的是'keyboardDismissMode'。 – Bill

+0

我有一个包含textField的UIView。我怎样才能做到这一点? –

+0

@GabyFitcal很好。阅读以上所有链接。我更新了它们。 – ma11hew28

22

幸运的是,苹果在UIScrollView上添加了方便的物业keyboardDismissMode,让您的生活变得轻松一些。

现在您的应用程序可以像Messages.app一样改变Storyboard上的单个属性,或者添加一行代码!

此属性使用新的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

希望帮助您解决问题,

+0

这太好了。兴奋起来,我无事可做,只是勾选了一个框。然后意识到我的键盘顶部附带的输入视图并未随之移动...... doh。 – bandejapaisa

1

swift你可以使用下面的代码来获取当前键盘的视图容器(如果存在),比你可以更改在你的代码e是的框架:这里

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

顺便说是一个叫Reveal工具,让你可以看到视图层次。