ios - Dejando inputAccessoryView visible después de que se despide el teclado
user-interface uitoolbar (5)
Actualizar a Swift 4, basado en respuestas anteriores. Si agrega barra de herramientas a través de storyboards , puede hacer esto
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBOutlet var toolbar: UIToolbar!
override var canBecomeFirstResponder: Bool {
get {
return true
}
}
override var inputAccessoryView: UIView {
get {
return self.toolbar
}
}
override func viewDidLoad() {
super.viewDidLoad()
textField.inputAccessoryView = toolbar
}
}
En este caso, siempre que el campo de texto renuncie a su primer respondedor, se establece por defecto el primer respondedor en la vista principal. Tenga en cuenta que es posible que desee renunciar explícitamente al primer respondedor y establecer la vista principal como primer respondedor si hay varios elementos de la IU y el valor predeterminado del primer respondedor es una vista no deseada después de la renuncia.
Lo que estoy tratando de hacer es crear algo similar a la función de búsqueda "encontrar en la página" en Safari en iPad.
Estoy utilizando una UIToolbar
con algunos elementos y la UITextField
al teclado configurándola como inputAccessoryView
en el UITextField
. Funciona como un amuleto, pero hay una cosa que no puedo entender. En Safari, cuando buscas algo, el teclado desaparece, pero la barra de herramientas permanece en la parte inferior de la pantalla.
¿Alguien tiene una pista sobre cómo lograr esto? La única solución que se me ocurre es responder a un evento de descartado de teclado y luego extraer la UIToolBar
y crear una animación personalizada que la mueva a la parte inferior de la pantalla. Pero esto es hacky. Estoy buscando una solución más elegante. Algo que me puede hacer decidir qué hacer con la vista del accesorio de entrada cuando se despide el teclado.
Agregando a la respuesta de @arik, aquí está la versión Swift:
class ViewController: UIViewController {
@IBOutlet var textField: UITextField!
// Input Accessory View
private var inputAccessoryToolbar: UIToolBar?
override func canBecomeFirstResponder() -> Bool {
return true
}
override var inputAccessoryView: UIView? {
return inputAccessoryToolbar
}
override func viewDidLoad() {
super.viewDidLoad()
inputAccessoryToolbar = UIToolbar(frame: CGRectMake(0, 0, view.frame.size.width, 50))
textField.inputAccessoryView = inputAccessoryToolbar
}
// UITextFieldDelegate
func textFieldShouldReturn(textField: UITextField) -> Bool {
becomeFirstResponder()
return true
}
}
¡Gracias por la solución limpia!
Es posible que también deba solucionar el error con inputAccessoryView que no respeta los márgenes del área segura y, por lo tanto, no deja espacio para el indicador de inicio en el iPhone X: iPhone X ¿Cómo manejar la entrada del controlador de vistaAccessoryView?
Encontré la solución más fácil cuando tiene un UIToolbar de un xib y también está utilizando ese UIToolbar como inputAccessoryView de un campo de texto para incrustar la barra de herramientas en una UIView cuando lo devuelve de su entrada anulada inputAccessoryView, y hacer que la UIView contenida sea más alta por el safeAreaInsets.bottom. (Otras soluciones sugieren restringir la parte inferior de la barra de herramientas al área segura en una subclase, pero esto conduce a conflictos de restricción y también significa que el área debajo de la barra de herramientas es de color incorrecto). Sin embargo, también debe tener en cuenta que el texto El campo puede tener enfoque incluso cuando no hay teclado en la pantalla (por ejemplo, si hay un teclado externo), por lo que también debe cambiar el inputAccessoryView de la vista de texto a esta barra de herramientas dentro de una vista UIV en ese caso también. De hecho, probablemente simplificará las cosas simplemente utilizando la vista contenedora y ajustando el tamaño de la manera adecuada. De todos modos, aquí está mi anulación de inputAccessoryView:
override var inputAccessoryView: UIView? {
if toolbarContainerView == nil {
let frame=CGRect(x: toolBar.frame.minX, y: toolBar.frame.minY, width: toolbar.frame.width, height: toolBar.frame.height+view.safeAreaInsets.bottom)
toolbarContainerView = UIView(frame: frame)
}
if (toolbar.superview != toolbarContainerView) {
//this is set to false when the toolbar is used above the keyboard without the container view
//we need to set it to true again or else the toolbar will appear at the very top of the window instead of the bottom if the keyboard has previously been shown.
toolbar.translatesAutoresizingMaskIntoConstraints=true
toolbarContainerView?.addSubview(toolbar)
}
return toolbarContainerView
}
Probablemente sería una buena idea anular viewSafeAreaInsetsDidChange para ajustar el tamaño de toolbarContainerView en ese caso, también.
Se hace así:
Asigne su UIToolbar a una propiedad en su controlador de vista:
@property (strong, nonatomic) UIToolbar *inputAccessoryToolbar;
En su controlador de vista superior, agregue estos métodos:
- (BOOL)canBecomeFirstResponder{
return YES;
}
- (UIView *)inputAccessoryView{
return self.inputAccessoryToolbar;
}
Y luego (opcionalmente, como normalmente no debería ser necesario), cada vez que el teclado se oculte, simplemente llame:
[self becomeFirstResponder];
De esa manera, su inputAccessoryToolbar será la vista del accesorio de entrada de su controlador de vista y de su vista de texto.
Terminé con UIToolBar
que no está asignada como vista de accesorios de entrada y deslice hacia arriba y hacia abajo en UIKeyboardWillShowNotification / UIKeyboardWillHideNotification