iMessage 风格聊天框后退带键盘

Posted

技术标签:

【中文标题】iMessage 风格聊天框后退带键盘【英文标题】:iMessage style chatbox recede with keyboard 【发布时间】:2014-08-19 17:37:54 【问题描述】:

我进行了大量搜索并实现了几个我从类似问题中找到的 sn-ps 代码。

我已经回答了几个类似这样的问题:iMessage Style Receding Keyboard in an ios App

设置后退键盘。这完美!我可以向下滚动,一旦我的手指碰到键盘,它就会开始向下滑动,直到我松开它然后它就会从屏幕上弹出。现在我的问题是让键盘正上方的UITextView 像在 iMessage 中一样工作。我想要的是一旦我的手指碰到 UITextView 的顶部,或者我的消息写入的地方也开始滑动。

DaKeyboardControl 在 iOS 8 上已损坏,因此无法选择,我不希望使用第三方自定义 API。

我的问题再次是,一旦我的手指碰到 textView,如何让键盘和 textview(用于输入您的信息)向下滑动。现在我的手指滑过 textView,然后一旦它碰到键盘它就开始滑落。我不希望我的手指在它开始滑动之前通过 textView。这是我正在谈论的视频: http://d.pr/v/8Pa6

【问题讨论】:

查看消息应用程序,您指的是什么UITextView 应该从屏幕上滑出? @Stonz2 在我的应用程序中,我在发送按钮旁边有一个带有约束的 UITextView,不完全确定它是如何在消息应用程序中设置的,但我指的是包含的视图您在发送按钮旁边输入的文本。消息应用程序中的向下滑动手势与该 textView 以及键盘交互,我的则没有。只有键盘 这是我正在查看的示例d.pr/v/8Pa6 那么,您的意思是希望键盘和UITextView 在触摸到达UITextView 的顶部时开始向下滑动,而不是等到触摸到达键盘? 没错,这就是我想要的 【参考方案1】:

假设您已按照问题中的链接教程进行操作。我将在代码中将包含UITextView 和“发送”按钮的视图简单地称为textView

您需要将textView 的框架包括在计算触摸发生的位置以及需要移动的时间。另外,保留一个previousY 的实例变量,它将保存触摸移动位置的y 坐标。

touchesMoved 方法中:

...
//updateY = keyboardSuperView.frame.origin.y;
if (point.y < keyboardSuperFrame.origin.y - textView.frame.size.height)
   return;

//if(point.y < previousY || point.y > previousY)
//
//    previousY = point.y;
    updateY = point.y + textView.frame.size.height;
//
...

如果您对此有任何问题,请告诉我,因为我实际上没有测试任何东西。


编辑:正如@Sam 引起我注意的那样,我拥有的第二个if 条件是非常不必要的。不管y val 是否改变,第三个if(未显示)仍然只有在y val 改变而没有第二个if 的情况下才会触发。只需要设置updateY即可。

【讨论】:

第二个条件是否必要? 它(在某种程度上)在大局中。只有当 y 值发生变化时,键盘框架才会发生变化。通过检查未显示的第三个条件中更新的y val,您可以避免无意义的帧更改。 @Sam 仔细考虑之后,我意识到您仍然是对的。相应地更新了帖子。

以上是关于iMessage 风格聊天框后退带键盘的主要内容,如果未能解决你的问题,请参考以下文章

iMessage 的 AppleScript 错误 - 无法获取文本聊天 ID 的服务

位于虚拟键盘下方的 iOS 7.1 输入字段强制缩放焦点

swift 聊天表情emoji转译——从键盘到输入框

swift 聊天表情emoji转译——从键盘到输入框

同时关闭带有视图的键盘

swift 聊天表情emoji转译——从键盘到输入框