Estoy usando a UITextField
con a UIPickerView
para su inputView
, de modo que cuando el usuario toca el campo de texto, se convoca a un selector para que seleccione una opción.
Casi todo funciona, pero tengo un problema: el cursor todavía parpadea en el campo de texto cuando está activo, lo cual es feo e inapropiado, ya que no se espera que el usuario escriba en el campo y no se le presente un teclado. Sé que hackily podía resolver esto mediante la creación editing
de NO
en el campo de texto y el seguimiento de toques en él, o sustituyéndolo por un botón personalizado de estilo, y llamando al selector a través de código. Sin embargo, quiero usar los UITextFieldDelegate
métodos para todo el manejo de eventos en el campo de texto y los hacks como reemplazar el campo de texto con un botón no permiten este enfoque.
¿Cómo puedo simplemente ocultar el cursor en el UITextField
lugar?
fuente
A partir de iOS 7, ahora puede configurarlo
tintColor = [UIColor clearColor]
en textField y el cursor desaparecerá.fuente
caretRectForPosition:
solución de anulación.Simplemente puede borrar el tinteColor del campo de texto
Swift 3.0
fuente
También es posible que desee evitar que el usuario seleccione, copie o pegue cualquier texto para que la única entrada de texto provenga de la vista del selector.
http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/
fuente
Consulte la propiedad
selectedTextRange
del protocoloUITextInput
al que se ajusta la claseUITextField
. ¡Pocos! Esa es una lección de programación orientada a objetos allí mismo.Hide Caret
Para ocultar el cursor, nula el rango de texto seleccionado del campo de texto.
Mostrar Caret
Aquí hay dos formas de mostrar el caret.
Establezca el rango de texto seleccionado del campo de texto al final del documento.
Para mantener el cursor en el mismo lugar, primero, almacene el rango de texto seleccionado del campo de texto en una variable de instancia.
Luego, cuando desee mostrar el cursor, simplemente configure el rango de texto seleccionado del campo de texto de nuevo a lo que era originalmente:
fuente
caretRectForPosition
. Es más explícito lo que está haciendo, y los documentos que ha citado no aclaran cuál debería ser el comportamiento del cursor cuando "no hay una selección actual". Si la afirmación de @ ArtGeigel de que esto no funciona fuera correcta (que no lo es, al menos por lo que puedo ver), no estaría claro que eso fuera un error.Respuesta proporcionada por el OP, copiada del cuerpo de la pregunta para ayudar a limpiar la cola cada vez mayor de preguntas sin respuesta.
Encontré otra solución: subclase
UIButton
y anular estos métodosAhora el botón, como a
UIResponder
, tiene un comportamiento similarUITextField
y una implementación bastante sencilla.fuente
UITextFieldDelegate
con esto para manejar los eventos de edición de inicio y finalización. En cambio, a menos que haya una manera de manejar esos eventos que no conozco, deberá anularbecomeFirstResponder
yresignFirstResponder
en la subclase de botones, y posiblemente crear su propio protocolo de delegado, agregar unadelegate
propiedad y llamar al delegado de lo mencionado anteriormente. métodos. Todo esto es mucho más trabajo que simplemente anularcaretRectForPosition
en unaUITextField
subclase.UIResponder
referencia de clase, y no tenía idea de que un truco como este fuera posible.UITextField
ay ocultar el cursor, que es básicamente un hack ya que estamos usando el campo de texto como etiqueta mientras sin utilizar ninguna de las funciones deUITextField
.Versión Swift 5 de la publicación de Net
fuente
configura el tintColor en Clear Color
y también puedes configurarlo desde el generador de interfaces
fuente
Si quieres ocultar el cursor, ¡puedes usar esto fácilmente! A mi me funciono ..
fuente
Respuesta proporcionada por el OP, copiada del cuerpo de la pregunta para ayudar a limpiar la cola cada vez mayor de preguntas sin respuesta.
Creo que tengo la solución correcta, pero si se puede mejorar será bienvenido :) Bueno, hice una subclase de UITextField y anulé el método que devuelve el CGRect para los límites
¿El problema? El texto no se muestra porque el rect es cero. Pero agregué un UILabel como una subvista del control y anulé el método setText para que, al ingresar un texto como de costumbre, el texto del campo de texto sea nulo y sea la etiqueta que muestra el texto
Con esto, la cosa funciona como se esperaba. ¿Conoces alguna forma de mejorarlo?
fuente
Para deshabilitar el cursor y el menú, uso la subclase con estos 2 métodos:
fuente
Simplemente subclase
UITextField
y anulo de lalayoutSubviews
siguiente manera:Es un truco sucio, y puede fallar en el futuro (en ese momento el cursor será visible nuevamente; su aplicación no se bloqueará), pero funciona.
fuente
Puede agregar una
BOOL cursorless
propiedad aUITextField
una categoría a través de objetos asociados.Luego, use el método swizzling para swizzle
caretRectForPosition:
con un método que alterna entreCGRectZero
y su valor predeterminado usandocursorless
.Esto lleva a una interfaz simple a través de una categoría desplegable. Esto se demuestra en los siguientes archivos.
Simplemente colóquelos y obtenga el beneficio de esta interfaz simple
UITextField
categoría: https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless.h https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless .metroMétodo Swizzling: https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject%2BRXRuntimeAdditions.h https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject% 2BRXRuntimeAdditions.m
fuente