10

Ho trascorso diversi giorni su questo senza soluzione in vista.come posso aumentare l'altezza di un inputAccessoryView

Ho un inputAccessoryView che consiste in un UIView contenente un textView e due pulsanti. Il comportamento di inputAccessoryView è come previsto e funziona in tutti i casi tranne uno.

Quando aumenta l'altezza di textView, sto cercando di aumentare l'altezza dello inputAccessoryView della stessa quantità. Quando ridefinisco l'altezza di inputAccessoryView in textViewDidChange, lo inputAccessoryView aumenta l'altezza verso il basso sulla tastiera anziché verso l'alto.

Ho provato molti suggerimenti diversi da SO ma niente ha funzionato. Immagino sia l'aggiunta automatica NSLayoutConstraint del inputAccessoryView ma non ho idea di come cambiare quel valore in swift e iOS 8.3.

func textViewDidChange(textView: UITextView) { 

    var contentSize = messageTextView.sizeThatFits(CGSizeMake(messageTextView.frame.size.width, CGFloat.max)) 

    inputAccessoryView.frame.size.height = contentSize.height + 16 

} 

aggiungendo

inputAccessoryView.setTranslatesAutoresizingMaskIntoConstraints(true) 

al codice di cui sopra aiuta e l'altezza inputAccessoryView aumenta verso l'alto in modo corretto ma ottengo Incapace di soddisfare contemporaneamente i vincoli per diversi vincoli ed è molto difficile identificare i colpevoli. Inoltre ottengo uno strano effetto del TextView creando spazio aggiuntivo di seguito su ogni seconda istanza di una nuova riga.

grazie.

+0

ho notato la prima chiamata di textViewDidChange non correttamente ridimensionare l'inputAccessoryView senza la linea setTranslatesAutoresizingMaskIntoConstraints, ma le chiamate successive non hanno alcun effetto. Mi chiedo perché sia ​​e come posso ripristinarlo in ogni momento iniziale – alionthego

risposta

18

Per aumentare la visualizzazione dell'accessorio in ingresso, è sufficiente impostare il valore autoresizingMask = .FlexibleHeight, calcolare il valore intrinsicContentSize e lasciare che il framework faccia il resto.

Il codice:

class InputAccessoryView: UIView, UITextViewDelegate { 

    let textView = UITextView() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     // This is required to make the view grow vertically 
     self.autoresizingMask = UIViewAutoresizing.FlexibleHeight 

     // Setup textView as needed 
     self.addSubview(self.textView) 
     self.textView.translatesAutoresizingMaskIntoConstraints = false 
     self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[textView]|", options: [], metrics: nil, views: ["textView": self.textView])) 
     self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[textView]|", options: [], metrics: nil, views: ["textView": self.textView])) 

     self.textView.delegate = self 

     // Disabling textView scrolling prevents some undesired effects, 
     // like incorrect contentOffset when adding new line, 
     // and makes the textView behave similar to Apple's Messages app 
     self.textView.scrollEnabled = false 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func intrinsicContentSize() -> CGSize { 
     // Calculate intrinsicContentSize that will fit all the text 
     let textSize = self.textView.sizeThatFits(CGSize(width: self.textView.bounds.width, height: CGFloat.max)) 
     return CGSize(width: self.bounds.width, height: textSize.height) 
    } 

    // MARK: UITextViewDelegate 

    func textViewDidChange(textView: UITextView) { 
     // Re-calculate intrinsicContentSize when text changes 
     self.invalidateIntrinsicContentSize() 
    } 

} 
+0

Grazie per una risposta molto concisa. – alionthego

+0

Come sapevi come fare questo? È magico come funziona! Mi piacerebbe conoscere il processo che hai seguito per imparare questa tecnica. –