用键盘上的button显示UIView,就像在Skype,Viber信使(Swift,iOS)

我想创build附件视图,在input附件视图下,通过键盘,如在Skype应用程序或Viber:

在这里输入图像说明

我已经在这里问这样的问题,但build议这个问题的解决scheme不是那么优雅,因为当我拖动我的滚动视图顶部,我想我的附件UIView下移键盘(我使用UIScrollViewKeyboardDismissModeInteractive)。

所以我创build了一个函数,找出视图,键盘和我的自定义input附件视图放置在哪里:

func findKeyboardView() -> UIView? { var result: UIView? = nil let windows = UIApplication.sharedApplication().windows for window in windows { if window.description.hasPrefix("<UITextEffectsWindow") { for subview in window.subviews { if subview.description.hasPrefix("<UIInputSetContainerView") { for sv in subview.subviews { if sv.description.hasPrefix("<UIInputSetHostView") { result = sv as? UIView break } } break } } break } } return result } 

在这里输入图像说明

之后,我添加一个我自定义的UIView并创build一些约束:

  func createAttachView() { attach = MessageChatAttachmentsView(frame: CGRectZero) let newView = findKeyboardView() newView!.addSubview(attach!) newView!.addConstraint(NSLayoutConstraint(item: accessoryView, attribute: .Bottom, relatedBy: .Equal, toItem: attach!, attribute: .Top, multiplier: 1.0, constant: 0.0)) attach!.addConstraint(NSLayoutConstraint(item: attach!, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 260)) attach!.addConstraint(NSLayoutConstraint(item: attach!, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 320)) } 

这在input附件视图和键盘上方创build自定义的UIView,当我向上滚动时它会移动。 但是当我想按下button,我按下键盘上的一个键。

在这里输入图像说明 在这里输入图像说明

那么如何将这个视图移动到UIInputSetHostView的视图层次结构的顶部?

奥基,感谢布赖恩镍,我发现也许不是优雅,但非常简单的解决scheme。 所以我已经覆盖了inputAccessoryView来创build一个键盘上的工具栏。 所以基本上,如果我按下这个工具栏上的附加button,我想看到另一个inputView,而不是键盘。 所以在我的自定义input附件视图类中,我创build了一些textView,这是隐藏的:

 class MessageChatInputAccessoryView : UIToolbar { var textView:UITextView! //textView for entering text var sendButton: UIButton! //send message var attachButton: UIButton! // attach button "+" var attachTextView:UITextView! --> this one override init(frame: CGRect) { super.init(frame: frame) ..... ..... attachTextView = UITextView(frame: CGRectZero) attachTextView.alpha = 0.0 self.addSubview(attachTextView) .... } 

所以在我的主视图控制器中,我创build了函数,为这个新创build的attachTextView重新初始化inputView,如下所示:

 func attach(sender: UIButton) { if attachMenuIsShown { accessoryView.attachTextView.inputView = accessoryView.textView.inputView accessoryView.attachTextView.reloadInputViews() attachMenuIsShown = false } else { accessoryView.attachTextView.becomeFirstResponder() accessoryView.attachTextView.inputView = MessageChatAttachmentsView(frame: CGRectZero) accessoryView.attachTextView.reloadInputViews() attachMenuIsShown = true } } 

所以当我按下附加button时,我的attachTextView成为第一响应者,并且比我重新初始化这个textView的input视图。 在input配件视图下,我可以看到我的附件。 当我再次按下附加button,我重新初始化input视图与默认inputView为我的主要textView,这是键盘视图。