当键盘显示在 iPhone 的消息应用程序上时,如果用户开始从消息表视图向下滑动并继续进入键盘区域,则键盘将开始关闭。如果他们在此过程中上下移动手指,键盘也会随之移动。
Apple 是否使用私有 API 来执行此操作,或者有没有办法通过(我认为)手势识别器来控制这样的键盘?
当键盘显示在 iPhone 的消息应用程序上时,如果用户开始从消息表视图向下滑动并继续进入键盘区域,则键盘将开始关闭。如果他们在此过程中上下移动手指,键盘也会随之移动。
Apple 是否使用私有 API 来执行此操作,或者有没有办法通过(我认为)手势识别器来控制这样的键盘?
最简单的解决方案是设置以下两个属性:
砰,宝贝!
幸运的是,Apple 添加了方便的属性keyboardDismissMode
,UIScrollView
让您的生活更轻松。
现在,您的应用程序可以像 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 属性:
希望能帮助解决您的问题
您可以使用 UISwipeGestureRecognizer 来执行此操作。我不知道如何使用代码来实现它,但如果您使用的是新的 xcode 4.2 beta,那么这里有一个简单的方法:
- (IBAction)dismiss:(id)sender;
转到您的 xib 中的视图并将您的视图类设置为 UIControl。
将 UISwipeGestureRecognizer 从库中拖动并连接到您的视图。
将 IBAction (TouchDown) 与 UISwipeGestureRecognizer 连接。
编写代码以关闭键盘:
- (IBAction)dismiss:(id)sender
{
[yourTextField resignFirstResponder];
}
完毕!
在swift中,您可以使用以下代码获取当前键盘的视图容器(如果存在),而不是您可以在代码中更改 is 的框架:
UIApplication.shared.windows
.filter{ NSStringFromClass($0.classForCoder) == "UIRemoteKeyboardWindow" }
.first?.subviews.filter { NSStringFromClass($0.classForCoder) == "UIInputSetContainerView" }
.first?.subviews.filter { NSStringFromClass($0.classForCoder) == "UIInputSetHostView" }
.first
顺便说一下,这里有一个名为Reveal的工具,您可以看到分层视图。
简短的回答;他们很可能在那里做一些“私有 API”的事情。
我很确定键盘位于应用程序窗口上方的独立视图中(您无法访问/控制它,无论如何它始终显示在顶部)。您最多可以做的是让输入视图成为/退出第一响应者状态,并且键盘将相应地出现/消失:全有或全无。
您可能能够获得键盘视图的句柄并更改其框架属性(使用记录类和未记录类的未记录属性),但我很确定这会让您被踢出商店。
我认为最好的方法是在文本输入容器上方放置一个隐藏按钮。一条长条,当它检测到触地并释放或取消时,然后隐藏键盘。
我要试一试,我会告诉你我怎么走的。