Animación de una transición de keyboard "inputView"

UITextField tiene una propiedad inputView que se puede usar para especificar un keyboard personalizado. Al borrar esto a nil proporciona el keyboard pnetworkingeterminado.

Si UITextField es el primer respondedor, no se produce ningún cambio al configurar inputView , pero al llamar a [textField reloadInputView] el cambio de keyboard ocurrirá inmediatamente.

Me gustaría poder cambiar entre dos enfoques de input diferentes. La interfaz para desencadenar esto será un UISegmentedView instalado como UITextField de inputAccessoryView .

Esto funciona, pero la transición es muy abrupta. En parte porque la ruleta y el keyboard de transición entre tienen diferentes tamaños en el iPad.

Descubrí que reloadInputView un bloque de animation alnetworkingedor de reloadInputView , obtendré una animation suave entre los frameworks de vista de los dos keyboards. Lamentablemente, hay un juicio visual porque la transición no está animada:

 [UIView animateWithDuration: 0.3 animations:^() { [firstResponder reloadInputViews]; }]; 

Alternativamente, si envuelvo la recarga en una transición, puedo get un buen desvanecimiento cruzado, pero no obtengo cambios de marco suaves:

 [UIView transitionWithView: keyboardWindow duration: 0.3 options: UIViewAnimationOptionTransitionCrossDissolve animations: ^(){ [firstResponder reloadInputViews]; } completion: nil]; 

(En el segundo bloque de código obtuve keyboardWindow de self.window porque esta vista está instalada como UITextField de inputAccessoryView que finalmente se anida debajo de la window del keyboard).

Lo que me gustaría es animar y hacer la transición de la recarga de la vista de input. Intenté colocar la recarga en una transición en una animation, y también intenté colocar la recarga en una animation en una transición; ninguno parecía ayudar.

¿Algunas ideas? ¡Gracias!

Soy capaz de animar con éxito los cambios a un inputView sin ningún problema inputView :

  1. Agregando el nuevo inputView como una subvista del inputView existente y luego
  2. Cambiando el UIControl de inputView a inputView personalizado inputView vez que inputView finalizado su elección de animation.

A modo de ejemplo, esta es la manera de desvanecerse rápidamente en un inputView personalizado:

 //start the view as invisible _customInputView.alpha = 0.0f; //add the custom inputView as a subview of the existing inputView [self.inputView addSubview:_customInputView]; //animate the opacity change [UIView animateWithDuration:0.25f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^{ _customInputView.alpha = 1.0f; } completion:^(BOOL finished) { //switch the UIControl's inputView self.inputView = _customInputView; }]; 

Puede invocar resignFirstResponder para hacer que la vista de input desaparezca e invocar a becomeFirstResponder , después de un retraso, para que aparezca el keyboard y viceversa.

Los siguientes sets se ponen en inputView después de renunciar al keyboard normal.

 let delayTime = dispatch_time(DISPATCH_TIME_NOW,Int64(1 * (NSEC_PER_SEC/3))) textField.resignFirstResponder() dispatch_after(delayTime, dispatch_get_main_queue()) { self.textField.inputView = currentInputView self.textField.becomeFirstResponder() } 

Esto se establece en el keyboard.

 dispatch_after(delayTime, dispatch_get_main_queue()) { self.textField.inputView = nil self.textField.becomeFirstResponder() }