2012-09-24 13 views
10

Estoy usando una barra de herramientas en la propiedad inputAccessoryView de un textView. Cuando el teclado muestra, muestra la barra de herramientas como se esperaba. Cuando se gira el dispositivo, quiero eliminar la barra de herramientas. Intenté:Cómo ocultar inputAccessoryView sin ignorar el teclado

myTextView.inputAccessoryView.hidden = !layoutIsPortrait; 

Esto esconde la barra de herramientas, pero deja atrás el contorno del teclado más alto. Aparentemente, el teclado todavía está dimensionado para ajustarse a la barra de herramientas. Se ve mal e interfiere con los eventos táctiles de los respondedores subyacentes.

myTextView.inputAccessoryView = nil; 

sólo funciona si resignFirstResponder, entonces becomeFirstResponder nuevo. Esto no es aceptable. Pierdo la ubicación del cursor y el contenido de la vista de texto, el teclado parpadea y retrocede.

[myTextView.inputAccessoryView removefromSuperview]; 

No hace nada. AHORRÉ una referencia a la barra de herramientas en una Ivar y dirigida que en vez,

[myIvarReference removeFromSuperview]; 

que funciona, pero de nuevo el contorno más alto del teclado es apenas visible. Esta vez no interfiere con toques de otras vistas. Entonces, esta es una solución de trabajo pero visualmente inaceptable. ¿Qué más puedo intentar mostrar y ocultar el inputAccessoryView a voluntad?

Screenshot- la línea débil por encima del teclado es remanente de la barra de herramientas eliminado

Rotated keyboard with toolbar removed

+0

¿Te importaría publicar una captura de pantalla de lo que quieres decir con "el contorno del teclado más alto"? Siento que las soluciones que mencionaste deberían funcionar (una al menos), pero no estoy seguro de qué es estéticamente aceptable para ti ... – geraldWilliam

+0

Agregué un acercamiento de la captura de pantalla –

+0

No puedo probarlo ahora pero myTextView.inputAccessoryView.frame = CGRectZero hace lo que estás buscando? – geraldWilliam

Respuesta

2

nunca encontró una forma de alterar el marco del teclado. Finalmente decidí renunciar a inputAccessoryView, agregar mi barra de herramientas directamente a la vista como una subvista y animarla yo mismo junto con el teclado directamente. Esto mantiene los dos independientes y, por lo tanto, no más línea.

23
myTextView.inputAccessoryView = nil; 
[myTextView reloadInputViews]; 

Esto quita la barra de herramientas de la vista y vuelve a cargar la vista. De esta forma no es necesario llamar a resignFirstResponder y becomeFirstResponder. Además, esto mantendrá la ubicación y el contenido del cursor.

+1

Gracias. Yo estaba buscando esto. Esta debería ser la respuesta aceptada. ¡1 de ventaja! – karim

4

Para mí, la solución de Eric nunca restableció realmente el marco o las áreas táctiles. Presumiblemente, es un error con la forma en que Apple maneja las cosas. Sin embargo, encontré una solución que resolvió el problema para mí. Cuando me puse una nueva inputAccessoryView sin un marco, reloadInputViews funcionó bien:

myTextView.inputAccessoryView = [[UIView alloc] initWithFrame: CGRectZero]; 
[myTextView reloadInputViews]; 
2

Ninguna de las respuestas anteriores estaban trabajando para mí y reloadInputViews estaba causando problemas extraños.Con el tiempo lo tengo para mostrar y ocultar y tienen toques pasarela haciendo:

ocultarlo:

[textview.inputAccessoryView setHidden:YES]; 
[textview.inputAccessoryView setUserInteractionEnabled:NO]; 

demostrarlo:

[textview.inputAccessoryView setHidden:NO]; 
[textview.inputAccessoryView setUserInteractionEnabled:YES]; 
0

código Xamarin es

Control.InputAccessoryView = new UIView(CGRect.Empty); 
Control.ReloadInputViews(); 
+0

En general, una respuesta debe consistir en algo más que un fragmento de código, como una explicación de por qué funciona. –

+0

fue solo la respuesta de jungziege reescrita para xamarin .................................. – shane

+0

Atribuya su respuesta como tal, algo así como "Convertir la respuesta de Jungziege a C# y Xamarin cede ..." Particularmente en el caso en que su respuesta se basa en la respuesta de otra persona, también es útil y cortés referirse a la respuesta original. –

0

Based en la respuesta de Eric Appel:

myTextView.inputAccessoryView = nil; 
[myTextView reloadInputViews]; 
hideInputAccessoryView = YES; 

modificar aún más:

- (BOOL)canBecomeFirstResponder 
{ 
    BOOL showInputAccessoryView = YES; 

    if (hideInputAccessoryView) 
     showInputAccessoryView = NO; 

    return showInputAccessoryView; 
} 

Esto debería ocultar InputAccessoryView incluso cuando se renunció el teclado.

0

Por extraño que parezca, ninguno de estos enfoques funcionó en mi caso.

Tengo un controlador de búsqueda que muestra un teclado Apple iOS estándar si se selecciona un alcance de búsqueda particular, y una vista de teclado personalizada con una vista de colección como campo de entrada en casos de otros ámbitos seleccionados. En ambos casos, se dibujó una vista de accesorio no deseada en la pantalla cuando se mostraba la vista de entrada.

Así,

self.mySearch.searchbar.inputAccessoryView = nil // did not work 

[self.mySearch.searhbar.inputAccessoryView setHidden:YES] // did not work 

self.mySearch.inputAccessoryView = nil // did not work 

self.mySearch.searchbar.inputAccessoryView.frame = CGRectZero //did not work 

[self.mySearch reloadInputViews] 

y diversas combinaciones de los mismos, etc., etc.

Lo que hizo el trabajo era eliminar a los accesorios individuales desde el punto de vista de accesorios:

// insert after assignments of mySearch delegates 
UITextInputAssistantItem *junk = [self.mySearch inputAssistantItem]; 
junk.leadingBarButtonGroups = @[]; 
junk.trailingBarButtonGroups = @[]; 
0
mTextView.inputAccessoryView = [[UIView alloc] initWithFrame:CGRectZero]; 
[mTextView reloadInputViews]; 

funciona para mí, configuración inputAccessoryView a nil no funcionará, simplemente no kn ¿por qué?

Cuestiones relacionadas