Показать UIView с кнопками по клавиатуре, например, в Skype, Viber messengers (Swift, iOS)

Я хочу создать вид вложений, который помещается под видом вспомогательного входа, поверх клавиатуры, например, в приложении Skype или Viber:

введите описание изображения здесь

Я уже задавал такой вопрос здесь , но предлагаемое решение для этого вопроса было не настолько изящным, потому что, когда я перетаскиваю свой вид прокрутки вверх, я хочу, чтобы мое приложение UIView перемещалось вниз с помощью клавиатуры (я использую UIScrollViewKeyboardDismissModeInteractive).

Поэтому я создаю функцию, которая обнаруживает представление, где размещаются клавиатура и мой пользовательский вид аксессуаров:

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 и создаю несколько ограничений:

  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)) } 

Это создает пользовательский UIView под видом вспомогательного входа и над клавиатурой, и он перемещается при прокрутке вверх. Но когда я хочу нажать кнопку, я нажимаю клавишу на клавиатуре.

введите описание изображения здесь введите описание изображения здесь

Итак, как я могу перенести этот вид на вершину иерархии представлений в UIInputSetHostView?

Okey, благодаря Брайану Никелю, я нашел, может быть, не элегантное, но очень простое решение. Поэтому я создал переопределить inputAccessoryView, чтобы создать панель инструментов над клавиатурой. Так что в основном, если я нажимаю на кнопку attach на этой панели инструментов, я хочу видеть еще один входной вид, а не клавиатуру. Таким образом, в моем пользовательском классе ввода класса доступа я создал только некоторый 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) .... } 

Поэтому в моем основном контроллере представления, я создал функцию, повторно инициализирую inputView для этого недавно созданного файла attachTextView, примерно так:

 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 } } 

Поэтому, когда я нажимаю кнопку attach, мой attachTextView становится первым ответчиком, и я снова инициализирую представление ввода для этого текстового элемента. И я получил вид прикрепленных вложений прямо под видом вспомогательного аксессуара. И когда я снова нажимаю кнопку присоединения, я снова инициализирую inputView с помощью inputView по умолчанию для моего основного текстового вида, который является клавиатурным представлением.

Interesting Posts
Давайте будем гением компьютера.