2015-09-16 12 views
6

voglio creare allegati visualizzare, che luoghi sotto ingresso vista accessorio, sopra la tastiera, come in Skype App o Viber:Visualizza UIView con i tasti sopra la tastiera, come Skype, i messaggeri Viber (Swift, iOS)

enter image description here

ho già chiesto questa domanda here, ma ha suggerito una soluzione per questa domanda non era così elegante, perché quando ho trascino la mia vista di scorrimento verso l'alto, voglio il mio attaccamento UIView spostare verso il basso con la tastiera (io uso UIScrollViewKeyboardDismissModeInteractive).

Così creo una funzione, che trovano la vista, dove si trovano la tastiera e il mio personalizzato vista accessorio ingresso:

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 
    } 

enter image description here

E dopo che aggiungo una mia abitudine UIView e creare alcuni vincoli:

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

questo argomento Crea UIView personalizzato in ingresso vista accessorio e al di sopra della tastiera, e si muove quando ho scorrere verso l'alto. Ma quando voglio premere il pulsante, premo un tasto sulla tastiera.

enter image description hereenter image description here

Così come posso spostare questo punto di vista al vertice della gerarchia vista in UIInputSetHostView?

+1

Penso che dovresti scambiare un nuovo 'inputView' e ricaricare le visualizzazioni di input. https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/InputViews/InputViews.html –

risposta

3

Okey, grazie a Brian Nickel, ho trovato forse non la soluzione elegante, ma molto semplice. Quindi avevo override inputAccessoryView per creare una barra degli strumenti sulla tastiera. Quindi, in pratica, se premo il pulsante di collegamento su questa barra degli strumenti, voglio vedere un altro inputView, non una tastiera. Così nel mio input personalizzato classe di visualizzazione accessorio ho creato solo alcuni textView, che è nascosto:

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

Così nel mio controller della vista principale, la funzione che ho creato, la ri-inizializzare inputView per questa nuova creazione attachTextView, qualcosa di simile questo:

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 
    } 

} 

Così quando si preme sul pulsante Allega, la mia attachTextView diventa first responder, e poi ho ri-inizializzare vista input per questo textView. E ho visto i miei allegati proprio sotto la vista degli accessori di input. E quando premo il pulsante attach ancora una volta, re-inizializzo inputView con inputView predefinito per la mia textView principale, che è la visualizzazione da tastiera.

Problemi correlati