10

Ich habe mehrere Tage auf diese ohne Lösung in Sicht verbracht.Wie kann ich die Höhe eines InputAccessoryView erhöhen

Ich habe eine inputAccessoryView, die aus einer UIView besteht, die eine textView und zwei Tasten enthält. Das Verhalten der inputAccessoryView ist wie erwartet und funktioniert in allen Fällen außer einem.

Wenn die Höhe der TextView zunimmt, versuche ich, die Höhe der inputAccessoryView um den gleichen Betrag zu erhöhen. Wenn ich die Höhe der inputAccessoryView in textViewDidChange neu definiere, erhöht die inputAccessoryView Höhe nach unten über die Tastatur statt nach oben.

Ich habe viele verschiedene Vorschläge von SO versucht, aber nichts hat funktioniert. Ich denke, es ist die automatisch NSLayoutConstraint der inputAccessoryView hinzugefügt, aber ich habe keine Ahnung, wie Sie diesen Wert in Swift und iOS 8.3 ändern.

func textViewDidChange(textView: UITextView) { 

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

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

} 

inputAccessoryView.setTranslatesAutoresizingMaskIntoConstraints(true) 

den obigen Code hinzufügen hilft und die inputAccessoryView Höhe steigt nach oben korrekt jedoch bekomme ich leider nicht möglich, gleichzeitig Einschränkungen erfüllen mehrere Einschränkungen, und es ist sehr schwierig, die Täter zu identifizieren. Außerdem bekomme ich einen seltsamen Effekt von textView, der unten auf jeder zweiten Instanz einer neuen Zeile zusätzlichen Platz schafft.

danke.

+0

i den ersten Anruf von textViewDidChange bemerkt habe, nicht richtig inputAccessoryView ohne die Linie setTranslatesAutoresizingMaskIntoConstraints die Größe, aber nachfolgende Anrufe haben keine Wirkung. Ich frage mich, warum das ist und wie ich es zu diesem Anfangszustand jedes Mal wiederherstellen kann – alionthego

Antwort

18

Um die vertikale Ansicht der Eingangsseite zu vergrößern, setzen Sie einfach autoresizingMask = .FlexibleHeight, berechnen Sie intrinsicContentSize und lassen Sie den Rahmen den Rest erledigen.

Der Code:

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

Vielen Dank für eine sehr knappe Antwort. – alionthego

+0

Woher wussten Sie, wie das geht? Es ist wie Magie, wie es einfach funktioniert! Ich würde gerne wissen, wie du diese Technik gelernt hast. –

Verwandte Themen