La extensión del keyboard pierde altura en iOS 10 al tratar de dimensionar automáticamente en algunos casos.

Puede download un proyecto de muestra que demuestre el problema a continuación aquí: https://github.com/DimaVartanian/keyboard-extension-height-bug

Al crear una extensión de keyboard y no especificar una altura de concreto para sus componentes, sino anclarlos a la vista / inputView para que, en teoría, el sistema determine su altura en function del entorno y la orientación, en algunas situaciones esa altura se convierte en 0 y el keyboard se aplasta (con la exception de cualquier cosa que tenga una altura concreta como una label o button de tamaño propio).

Esto solo parece ocurrir en iOS 10. En iOS 9, las vistas secundarias cambiaron de tamaño correctamente para ajustarse a la altura pnetworkingeterminada del keyboard automático.

Hay varios escenarios que pueden manifestarse y este proyecto demuestra uno básico. Comienza con la plantilla básica de extensión del keyboard con el button pnetworkingeterminado "siguiente keyboard" y las 2 restricciones de tamaño con las que viene:

self.nextKeyboardButton.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true self.nextKeyboardButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 

A continuación, creamos una única vista diferente que queremos llenar el espacio de la supervisión sin definir un tamaño concreto para sí mismo:

 let anotherView = UIView() anotherView.backgroundColor = UIColor.networking anotherView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(anotherView) anotherView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true anotherView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true anotherView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true 

Ahora, digamos que solo queremos anclar esta nueva vista en la parte inferior de nuestra supervisión de keyboard. Simplemente haríamos algo como:

 anotherView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 

El resultado se ve así:

iOS 9 introduzca la descripción de la imagen aquí

iOS 10 introduzca la descripción de la imagen aquí

Este layout es exactamente lo que esperamos. Ahora, en lugar de eso, anclemos la nueva vista a la parte superior de nuestro siguiente button de keyboard. Nos deshacemos de la restricción que acabamos de agregar y la reemplazamos por

 anotherView.bottomAnchor.constraint(equalTo: self.nextKeyboardButton.topAnchor).isActive = true 

Lógicamente, la altura resultante debe ser la misma (determinada por el sistema)

El resultado es ahora esto:

iOS 9 introduzca la descripción de la imagen aquí

iOS 10 introduzca la descripción de la imagen aquí

En iOS 9 se comporta como se espera, pero en iOS 10, la vista de altura flexible se networkingimensiona a 0 y todo lo que queda es el button de altura fija.

No hay posts sobre restricciones conflictivas. Estoy tratando de averiguar qué podría estar causando esto y por qué solo sucedería en iOS 10.

Apple respondió a mi ticket de DTS y me dijo que presentara un informe de error, por lo que este es en realidad un error de iOS 10. He archivado un radar (# 28532959) y actualizaré esta respuesta si alguna vez recibo una respuesta. Si alguien más encuentra una solución concreta que me permita seguir usando la reproducción automática para lograr una altura automática, las respuestas siguen siendo aceptadas.

Esta es mi solución. Es un poco floja cuando el dispositivo gira, pero hará el trabajo hasta que Apple solucione este error. Primero pensé que tenía algo que ver con inputView.allowSelfSizing , pero esa variable no parecía cambiar nada.

Primero, declare heightConstraint :

 var heightConstraint: NSLayoutConstraint! 

En viewDidLoad , agrega tu vista personalizada:

 let nibName: String! = UIDevice.isPhone ? "KeyboardViewiPhone" : "KeyboardViewiPad" customView = Bundle.main.loadNibNamed(nibName, owner: self, options: nil)?.first as! UIView customView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(customView) 

Agregue una restricción para el ancho como lo haría normalmente:

 let widthConstraint = NSLayoutConstraint(item: view, attribute: .width, relatedBy: .equal, toItem: customView, attribute: .width, multiplier: 1.0, constant: 0.0) 

Agregue una restricción constante para la altura:

 heightConstraint = NSLayoutConstraint(item: customView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: view.frame.height) view.addConstraints([widthConstraint, heightConstraint]) 

Ahora viene la solución:

 override func viewDidLayoutSubviews() { heightConstraint.constant = view.bounds.height } 

Como se llama a viewDidLayoutSubviews cada vez que view.bounds cambia, manejará correctamente los cambios de orientación.

También me enfrenté al mismo problema. Esto se debe a las Restricciones de Autolayout. Solo elimina todas las restricciones. y configurar el cambio de tamaño automático. introduzca la descripción de la imagen aquí

Lo solucioné estableciendo una nueva restricción para la altura.

introduzca la descripción de la imagen aquí

También me he enfrentado al mismo problema para la extensión de keyboard personalizado en Xcode 8.2. Esto es causado por el auto resizing . En mi caso, resolví esto de la siguiente manera.

Inicialmente, mi keyboard personalizado tiene 3 vistas. En esto, se solucionó el final, la parte superior y la altura para la primera y última vista. Y coloque la vista central como en la image. introduzca la descripción de la imagen aquí

después de eso, select la vista del medio y abra el show the size inspector en el guión gráfico. En el size inspector, encontrará una opción de auto resizing . En eso, select los indicadores de restricción para esa vista.

introduzca la descripción de la imagen aquí

Después de seleccionar que ejecutes tu proyecto en un dispositivo y funcionará correctamente sin perder ninguna vista.

Nota: – Funcionará para los modos vertical y horizontal. Y, sobre todo, no tiene que dar restricciones para la vista del medio.