Cambiar el tamaño de inputAccessoryView dinámicamente en iOS 8

Básicamente, estoy tratando de crear un UITextView networkingimensionado dentro de una propiedad inputAccessoryView.

Tengo un viewController con el método canBecomeFirstResponder devolviendo true y una vista instanciando a través de una class personalizada (que lo obtiene de un XIB). Dentro de esta vista se ubica un UITextView.

Intento cambiar el tamaño de inputAccessoryView completo desde dentro de esa class. Lo intenté de varias maneras: estableciendo el frame directy, intente usar una restricción de altura. Parece que cambia de tamaño solo a la mitad:

Esto es básicamente lo que quiero (con o sin autolayout, pero trabajando en iOS 7/8 +):

class MessageInputAccessory: UIView, UITextViewDelegate { @IBOutlet weak var textView: UITextView! func textViewDidChange(textView: UITextView) { var contentSize = textView.sizeThatFits(CGSizeMake(textView.frame.size.width, CGFloat.max)) self.frame.size.height = contentSize.height + 20 self.textView.reloadInputViews() } } 

He encontrado esta publicación: Cambiar el marco de un inputAccessoryView en iOS 8 . Afirmando que se está creando una restricción creada automáticamente. La cosa es que no crea la restricción para mí. De ninguna manera, con autolayout deshabilitado o habilitado (también a través de setTranslatesAutoresizingMaskIntoConstraints ()).

Funciona para mí en iOS7 / iOS8:

 class MessageInputAccessory: UIView, UITextViewDelegate { private var textView: UITextView! private var heightConstraint: NSLayoutConstraint? override init(frame: CGRect) { super.init(frame: frame) commonInit() } requinetworking init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonInit() } func commonInit() { self.userInteractionEnabled = true textView = UITextView() textView.delegate = self textView.bounces = false textView.scrollEnabled = false textView.layer.cornerRadius = 5 textView.layer.borderWidth = 1 textView.layer.borderColor = UIColor.blueColor().CGColor self.addSubview(textView) } override func layoutSubviews() { super.layoutSubviews() textView.frame = self.bounds } override func addConstraint(constraint: NSLayoutConstraint) { self.heightConstraint = constraint super.addConstraint(constraint) } func textViewDidChange(textView: UITextView) { var contentSize = textView.sizeThatFits(CGSizeMake(textView.frame.size.width, CGFloat.max)) self.frame.size.height = contentSize.height if let heightConstraint = self.heightConstraint { heightConstraint.constant = self.frame.size.height } self.textView.reloadInputViews() } } 

EDIT: Esto funciona también con xib (iOS7 / iOS8):

 class MessageInputAccessory: UIView, UITextViewDelegate { @IBOutlet var textView: UITextView! @IBOutlet var textViewHeightConstraint: NSLayoutConstraint! private var heightConstraint: NSLayoutConstraint? override func awakeFromNib() { textView.layer.cornerRadius = 5 textView.layer.borderWidth = 1 textView.layer.borderColor = UIColor.blueColor().CGColor } override func layoutSubviews() { textViewHeightConstraint.constant = self.bounds.size.height super.layoutSubviews() } override func addConstraint(constraint: NSLayoutConstraint) { if constraint.firstItem === self { self.heightConstraint = constraint } super.addConstraint(constraint) } override func addConstraints(constraints: [AnyObject]) { super.addConstraints(constraints) } func textViewDidChange(textView: UITextView) { var contentSize = textView.sizeThatFits(CGSizeMake(textView.frame.size.width, CGFloat.max)) self.frame.size.height = contentSize.height if let heightConstraint = self.heightConstraint { heightConstraint.constant = self.frame.size.height } self.textView.reloadInputViews() } override func intrinsicContentSize() -> CGSize { return self.bounds.size; } } 

Hay mi xib: introduzca la descripción de la imagen aquí

No es una buena solución, pero funciona … Por favor, cuénteme si conoce una mejor manera.

Una solución bastante simple para esto es no hacer cambiar el tamaño real de inputAccessoryView, si conoce la altura máxima que necesitará para ello, puede crearlo a esa altura máxima, hacerlo transparente y agregar una subvista que se networkingimensiona sin embargo te gusta.

El detalle que necesita para que funcione es que el inputAccessoryView debe ser una subclass UIView que contenga lo siguiente:

 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { point = [self.innerView convertPoint:point fromView:self]; return [self.innerView pointInside:point withEvent:event]; } 

(donde self.innerView es su subview de cambio dinámicamente).

Esto lo hace reclamar golpecitos dentro de la subvista, pero transmitir cualquiera que caiga fuera de él.

El inconveniente principal a tener en count es que las notifications de keyboard le darán frameworks que contienen todo el valor máximo de inputAccessoryView. Entonces, si los está usando para (por ejemplo) ajustar inserciones, debe hacer algunas matemáticas adicionales allí.