键盘上的UIView类似于iMessage App

pkl*_*luz 26 uitextview uikeyboard ios

目前我正在尝试基本实现和精确复制Apples iMessage App.

这意味着我需要一个停靠在屏幕底部的UITextView,并在它成为firstResponder时向上移动. - 实际上这很容易.有很多方法可以做到这一点,如果收到通知,最常见的两个当然是向上或向下动画.另一种是通过inputAccessoryView来完成.可悲的是,有一些功能,另一个没有.它们似乎是相互排斥的.

最大的问题是轮换.

我已经深入研究了至少七个不同的github项目,它们都重新实现了我想要实现的相同功能/行为,但实际上所有这些项目都失败了.

例如,官方Facebook/FacebookMes​​senger /(可能是WhatsApp)应用程序使用的HPGrowingTextView是一大块垃圾代码.拿你的iDevice,打开Facebook应用程序,进行聊天,弹出键盘并旋转你的设备.如果你注意你会注意到输入条略微跳跃,并在键盘的框架和它自己的框架之间留下一些空白.然后在显示键盘时查看iMessage中的Apples实现.这是完美的.

除此之外,HPGrowingTextView库使用的contentOffset和EdgeInset-hacking给了我噩梦.

所以我想自己做,从头开始.

现在,我已经有了一个非常光滑,优雅和无法实现的不断增长的UITextView,但缺少一部分.

优雅的旋转.

当我在willRotateToInterfaceOrientation:duration:方法中简单地将帧调整到各自的新位置时,一切都会完美地完成,但我遇到的问题与HPGrowingTextView(请参阅Facebook App)有关.旋转发生时,输入视图和键盘之间有一点点空间.

我发现当将设备旋转到横向时,当前显示的人像键盘不会"变形"而是消失(发送'willHide'通知)并重新出现横向版本(发送'willShow'通知).过渡是一种非常微妙的淡化,可能还有一些调整.

我使用inputAccessoryView重新实现了我的项目,看看当时发生了什么,我感到非常惊喜.inputAccessoryView与键盘完美同步旋转.两者之间没有空隙/间隙.

遗憾的是,我还没有想出如何将inputAccessoryView停靠在屏幕底部并且不会在键盘旁边消失/移出它...

我不想要的是hack-y解决方案,例如,"在toInterfaceOrientation的CoordinateSystem中稍微降低帧,然后在调用didRotateFrom ...时将其移回."

我知道另一个已经设法实现此类行为的应用程序,它是"Kik Messenger".

有没有人有想法,建议或链接,我还没有看到这个主题?

谢谢你!

注意:一旦这个问题得到解决,我将开放项目供所有人利用,因为几乎我在过去几天能够找到的所有实现都是一团糟.

ale*_*mix 11

我最近遇到了同样的问题,并且不得不构建一个自定义解决方案,因为我对可用的第三方库并不完全满意.我已将此实现拆分为它自己的GitHub项目:

MessageComposerView

从iOS 6.1 7和8模拟器上的一些简单测试来看,旋转似乎正好跟随键盘.视图也将随文本一起增长,并在旋转时自动调整大小.

MessageComposerView

您可以使用非常基本的init功能来创建屏幕宽度和默认高度,例如:

self.messageComposerView = [[MessageComposerView alloc] init];
self.messageComposerView.delegate = self;
[self.view addSubview:self.messageComposerView];
Run Code Online (Sandbox Code Playgroud)

还有其他一些初始化程序可用于自定义框架,键盘偏移和textview最大高度.请参阅自述文件了解更多!

  • 这是一个很好的建议!我会尽快设置 - 希望在接下来的几周内. (2认同)

pkl*_*luz 5

我已经成功地以一种优雅的方式解决了这个问题(我认为,...)。

该代码将于下周在Github上发布,并链接到此答案。

-

怎么做:我通过选择inputAccessoryView的方式使旋转工作。

命名法:

  1. “ MessageInputView”是一个包含我的“ GrowingUITextView”的UIView (它还包含一个“发送”按钮和背景图片)。
  2. “ ChatView”是属于ChatViewController的视图,该视图显示所有Chatbubbles,并且将我的“ MessageInputView”停靠在底部。
  3. 'keyboardAccessoryView'是一个空的UIView,大小为:CGRect(0,0,0,0)。

我需要弄清楚在关闭键盘时如何使MessageInputView粘在屏幕上。那是棘手的部分。我通过创建另一个视图(keyboardAccessoryView)来做到这一点,并让我的GrowingUITextView将其用作其inputAccessoryView。我保留了keyboardAccessoryView,因为以后需要引用它。

然后,我想起了我其他尝试中所做的一些事情(每当键盘通知到达时,都会在屏幕周围对MessageInputView的帧进行动画处理)。

我将MessageInputView作为子视图添加到了ChatView中(在最底部)。每当激活它并通过键盘通知调用willShow:方法时,我都会手动将MessageInputView的帧设置为动画的顶部指定位置。当动画结束并且完成块执行时,我从ChatView中移除子视图并将其添加到keyboardAccessoryView。这会导致触发另一个通知,因为每次更改inputAccessoryView的框架/边界时,键盘都会重新加载!您需要意识到这一点并妥善处理!

当键盘即将关闭时,我将MessageInputView的框架转换为ChatView的坐标系,并将其添加为子视图。因此,它已从我的keyboardAccessoryView中删除。然后,我将keyboardAccessoryView的框架调整为CGRect(0,0,0,0),因为否则UIViewAnimationDuration不匹配!然后,允许关闭键盘,并让我的MessageInputView从上方跟随它,最后停靠在屏幕底部。

但是,这是很多工作,却没有什么收获。

-

照顾自己。

PS:如果有人想出一种简单的方法(完美),请告诉我。

  • 嗨,伙计,您是否将代码发布到github? (22认同)