【发布时间】:2012-01-17 15:52:18
【问题描述】:
目前我正在尝试基本上实现和精确复制 Apples iMessage 应用程序。
这意味着我需要一个停靠在屏幕底部的 UITextView,并在它成为 firstResponder 时向上移动。 - 这实际上很容易。有无数种方法可以做到这一点,其中两种最常见的方法当然是在收到 通知 时向上或向下设置视图动画。另一种是通过inputAccessoryView 来实现。可悲的是,一个有一些功能,另一个没有。而且它们似乎是相互排斥的。
最大的问题是旋转。
我已经挖掘了大约至少七个不同的 github 项目,所有这些项目都重新实现了我想要实现的相同功能/行为,但实际上所有这些项目都惨遭失败。
例如,官方 Facebook/FacebookMessenger/(可能还有 WhatsApp)应用程序使用的 HPGrowingTextView 就是一大段垃圾代码。拿起您的 iDevice,打开 Facebook 应用程序,进入聊天室,弹出键盘并旋转您的设备。如果您注意,您会注意到输入栏略有跳跃,并在键盘框架和它自己的框架之间留下一些空白空间。然后在显示键盘时查看 Apple 在 iMessage 中的实现。很完美。
除了 HPGrowingTextView 库使用的 contentOffset 和 EdgeInset-hacking 给我带来了噩梦。
所以我想自己做,从头开始。
现在,我有一个非常流畅、优雅且无需 hack 的不断增长的 UITextView 实现,但缺少一部分。
优雅的旋转。
当我在 willRotateToInterfaceOrientation:duration: 方法中简单地将框架调整到它们各自的新位置时,一切都会完美运行,但我遇到了与 HPGrowingTextView(请参阅 Facebook 应用程序)相同的问题。旋转发生时,输入视图和键盘之间有一点空间。
我发现当将设备旋转到横向时,当前显示的纵向键盘不会“变形”而是消失(发送“willHide”通知)并且横向版本重新出现(发送“willShow”通知) .过渡是一个非常微妙的淡入淡出,可能会调整大小。
我使用 inputAccessoryView 重新实现了我的项目,看看会发生什么,我感到非常惊喜。 inputAccessoryView 与键盘完美同步旋转。两者之间没有空间/差距。
遗憾的是,我还没有想出如何让 inputAccessoryView 停靠在屏幕底部并且不在键盘旁边消失/移出...
我不想要的是 hack-y 解决方案,例如...“在 toInterfaceOrientation 的 CoordinateSystem 中稍微降低框架,然后在调用 didRotateFrom... 时将其向上移动。”
我知道另一个应用程序已经成功实现了这种行为,它是“Kik Messenger”。
是否有人有我尚未看到的涵盖该主题的想法、建议或链接?
非常感谢!
注意:一旦解决了这个问题,我将开源该项目以供所有人获利,因为在过去几天中我能够找到的几乎所有实现都是一团糟。
【问题讨论】:
-
你能拦截keyboardShouldHide通知并手动隐藏键盘吗?
-
好吧,我不是想隐藏键盘,只是让我的栏(位于键盘顶部)与键盘完美同步旋转。我不应该担心键盘动画 - 我认为 - (只是试图理解它们)。此外我无法访问键盘动画属性的方式(好吧,反正不是直接)......
-
将其设为输入附件有什么问题?旋转不完美吗?
-
另外,请记住有两个阶段的轮换。其他一些需要研究的东西是石英框架和 UIKit 文档。
-
inputaccessoryview 的问题在于,即使关闭键盘,我也需要 inputaccessoryview 保持在屏幕上(请参阅消息应用程序以供参考)。我还没有找到使这成为可能的方法。但是,是的,inputaccessoryview 完美地与键盘同步旋转。
标签: ios uitextview uikeyboard