Es trivial hacer que se pueda hacer clic en hipervínculos en a UITextView
. Simplemente configura la casilla de verificación "detectar enlaces" en la vista en IB, y detecta enlaces HTTP y los convierte en hipervínculos.
Sin embargo, eso todavía significa que lo que el usuario ve es el enlace "en bruto". Los archivos RTF y HTML le permiten configurar una cadena legible por el usuario con un enlace "detrás".
Es fácil instalar texto atribuido en una vista de texto (o una UILabel
o UITextField
, para el caso). Sin embargo, cuando ese texto atribuido incluye un enlace, no se puede hacer clic en él.
¿Hay una manera de hacer que el usuario puede hacer clic legible texto en una UITextView
, UILabel
o UITextField
?
El marcado es diferente en SO, pero aquí está la idea general. Lo que quiero es un texto como este:
Esta transformación se generó con Face Dancer , haga clic para ver en la tienda de aplicaciones.
Lo único que puedo obtener es esto:
Esta transformación se generó con Face Dancer. Haga clic en http://example.com/facedancer para verla en la tienda de aplicaciones.
Respuestas:
Use NSMutableAttributedString .
Editar :
No se trata directamente de la pregunta, sino solo para aclarar,
UITextField
yUILabel
no admite la apertura de URL. Si desea usarUILabel
con enlaces, puede verificar TTTAttributedLabel .También debe establecer
dataDetectorTypes
el valor de laUITextView
aUIDataDetectorTypeLink
, oUIDataDetectorTypeAll
al abrir las URL cuando se hace clic. O puede usar el método delegado como se sugiere en los comentarios.fuente
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
NSURL
. ----[str addAttribute: NSLinkAttributeName value: [NSURL URLWithString:@"http://www.google.com"] range: NSMakeRange(0, str.length)];
NSAttributedString.h
UIKIT_EXTERN NSString * const NSLinkAttributeName NS_AVAILABLE(10_0, 7_0); // NSURL (preferred) or NSString
Encontré esto realmente útil, pero necesitaba hacerlo en bastantes lugares, así que resumí mi enfoque en una extensión simple para
NSMutableAttributedString
:Swift 3
Swift 2
Ejemplo de uso:
C objetivo
Acabo de cumplir un requisito para hacer lo mismo en un proyecto puro de Objective-C, así que aquí está la categoría de Objective-C.
Ejemplo de uso:
Asegúrese de que el atributo de comportamiento del NSTextField esté configurado como Seleccionable.
fuente
Acabo de crear una subclase de UILabel para abordar especialmente estos casos de uso. Puede agregar múltiples enlaces fácilmente y definir diferentes manejadores para ellos. También admite resaltar el enlace presionado cuando toca hacia abajo para obtener retroalimentación táctil. Consulte https://github.com/null09264/FRHyperLabel .
En su caso, el código puede ser así:
Captura de pantalla de muestra (el controlador está configurado para mostrar una alerta en lugar de abrir una URL en este caso)
fuente
- (void)setLinkForRange:(NSRange)range withLinkHandler:(void(^)(FRHyperLabel *label, NSRange selectedRange))handler;
lugar. Consulte el archivo Léame en la página de Github.Mejora menor a la solución de ujell: si usa NSURL en lugar de NSString, puede usar cualquier URL (por ejemplo, URL personalizadas)
¡Que te diviertas!
fuente
Swift 4:
Swift 3.1:
fuente
Yo también tenía un requisito similar, inicialmente usé UILabel y luego me di cuenta de que UITextView es mejor. Hice que UITextView se comportara como UILabel deshabilitando la interacción y el desplazamiento e hice un método de categoría para
NSMutableAttributedString
establecer el enlace al texto igual que lo que Karl había hecho (+1 para eso) esta es mi versión obj cpuede usar el siguiente delegado para manejar la acción
fuente
NSForegroundColorAttributeName
en un rango dondeNSLinkAttributeName
se aplica no funciona. No importa cuál sea, ellinkTextAttributes
de laUITextView
se aplican en su lugar. ¿NSForegroundColorAttributeName
Funciona para ti?linkTextAttributes
lo mismo? o tal veztintColor
? ¿Eres capaz de hacer que 2 enlaces aparezcan en diferentes colores en la misma vista de texto?Utilice UITextView, es compatible con enlaces clicables. Crea una cadena atribuida usando el siguiente código
Luego configure el texto UITextView de la siguiente manera
Asegúrese de habilitar el comportamiento "Seleccionable" de UITextView en XIB.
fuente
Selectable
es importante!El meollo de mi pregunta era que quería poder crear enlaces en los que se pueda hacer clic en vistas de texto / campos / etiquetas sin tener que escribir un código personalizado para manipular el texto y agregar los enlaces. Quería que se basara en datos.
Finalmente descubrí cómo hacerlo. El problema es que IB no respeta los enlaces incrustados.
Además, la versión de iOS de
NSAttributedString
no le permite inicializar una cadena atribuida desde un archivo RTF. La versión de OS X deNSAttributedString
does tener un inicializador que toma un archivo RTF como entrada.NSAttributedString
cumple con el protocolo NSCoding, por lo que puede convertirlo a / desde NSDataCreé una herramienta de línea de comandos OS X que toma un archivo RTF como entrada y genera un archivo con la extensión .data que contiene NSData de NSCoding. Luego pongo el archivo .data en mi proyecto y agrego un par de líneas de código que cargan el texto en la vista. El código se ve así (este proyecto estaba en Swift):
Para las aplicaciones que usan mucho texto formateado, creo una regla de compilación que le dice a Xcode que todos los archivos .rtf en una carpeta dada son fuente y que los archivos .data son la salida. Una vez que hago eso, simplemente agrego archivos .rtf al directorio designado (o edito archivos existentes) y el proceso de compilación descubre que son nuevos / actualizados, ejecuta la herramienta de línea de comandos y copia los archivos en el paquete de la aplicación. Funciona muy bien
Escribí una publicación de blog que vincula a un proyecto de muestra (Swift) que demuestra la técnica. Puedes verlo aqui:
Crear URL en las que se puede hacer clic en un UITextField que se abre en su aplicación
fuente
Ejemplo de Swift 3 para detectar acciones en toques de texto atribuidos
https://stackoverflow.com/a/44226491/5516830
Como sabio, puede agregar cualquier acción que desee con
shouldInteractWith URL
método UITextFieldDelegate.¡¡Salud!!
fuente
La respuesta rápida es usar UITextView en lugar de UILabel. Necesita habilitar
Selectable
y deshabilitarEditable
.Luego deshabilite los indicadores de desplazamiento y los rebotes.
Mi solución usando una
NSMutableAttributedString
cadena htmlNSHTMLTextDocumentType
fuente
NSAttributedString
, configurarlo comoattributedText
miUITextView
y los hipervínculos simplemente funcionan! Hubiera sido mucho trabajo encontrar el rango de cada hipervínculo y configurarlo usando atributos.He escrito un método que agrega un enlace (linkString) a una cadena (fullString) con una cierta url (urlString):
Deberías llamarlo así:
fuente
Necesitaba seguir usando un UILabel puro, así lo llamé desde mi reconocedor de tomas (esto se basa en la respuesta de malex aquí: índice de caracteres en el punto de contacto para UILabel )
fuente
Actualizar:
Había 2 partes clave en mi pregunta:
Resulta que iOS 7 agregó la capacidad de cargar texto atribuido desde
NSData
.Creé una subclase personalizada
UITextView
que aprovecha la@IBInspectable
atributo y le permite cargar contenido de un archivo RTF directamente en IB. Simplemente escriba el nombre del archivo en IB y la clase personalizada hace el resto.Aquí están los detalles:
En iOS 7,
NSAttributedString
ganó el métodoinitWithData:options:documentAttributes:error:
. Ese método le permite cargar una NSAttributedString desde un objeto NSData. Primero puede cargar un archivo RTF en NSData, luego usarloinitWithData:options:documentAttributes:error:
para cargar ese NSData en su vista de texto. (Tenga en cuenta que también hay un métodoinitWithFileURL:options:documentAttributes:error:
que cargará una cadena atribuida directamente desde un archivo, pero ese método se desaprobó en iOS 9. Es más seguro usar el métodoinitWithData:options:documentAttributes:error:
, que no se desaprobó.Quería un método que me permitiera instalar enlaces clicables en mis vistas de texto sin tener que crear ningún código específico para los enlaces que estaba usando.
La solución que se me ocurrió fue crear una subclase personalizada de UITextView a la que llamo
RTF_UITextView
y asignarle una@IBInspectable
propiedad llamadaRTF_Filename
. Agregar el@IBInspectable
atributo a una propiedad hace que Interface Builder exponga esa propiedad en el "Inspector de atributos". Luego puede establecer ese valor desde IB sin código personalizado.También agregué un
@IBDesignable
atributo a mi clase personalizada. El@IBDesignable
atributo le dice a Xcode que debe instalar una copia en ejecución de su clase de vista personalizada en el generador de interfaces para que pueda verla en la visualización gráfica de su jerarquía de vistas. () Desafortunadamente, para esta clase, la@IBDesignable
propiedad parece ser escamosa. Funcionó cuando lo agregué por primera vez, pero luego eliminé el contenido de texto sin formato de mi vista de texto y los enlaces en los que se puede hacer clic desaparecieron y no he podido recuperarlos).El código para mi
RTF_UITextView
es muy simple. Además de agregar el@IBDesignable
atributo y unaRTF_Filename
propiedad con el@IBInspectable
atributo, agregué undidSet()
método a laRTF_Filename
propiedad. EldidSet()
método se llama cada vez queRTF_Filename
cambia el valor de la propiedad. El código para eldidSet()
método es bastante simple:Tenga en cuenta que si la propiedad @IBDesignable no le permitirá obtener una vista previa de su texto con estilo en el generador de interfaces, entonces sería mejor configurar el código anterior como una extensión de UITextView en lugar de una subclase personalizada. De esa manera, podría usarlo en cualquier vista de texto sin tener que cambiar la vista de texto a la clase personalizada.
Vea mi otra respuesta si necesita admitir versiones de iOS anteriores a iOS 7.
Puede descargar un proyecto de muestra que incluye esta nueva clase desde gitHub:
Proyecto de demostración DatesInSwift en Github
fuente
Simplemente encuentre una solución sin código para UITextView:
¡Activar Detección-> Opciones de enlaces, la URL y también el correo electrónico serán detectados y se podrá hacer clic en ellos!
fuente
Versión rápida:
fuente
Use UITextView y establezca dataDetectorTypes para Link.
Me gusta esto:
Si desea detectar el enlace, el número de teléfono, la dirección, etc., entonces
fuente
http://somedomain/someurl?param=value
Una adición rápida a la descripción original de Duncan C frente al comportamiento de IB. Él escribe: "Es trivial hacer que se pueda hacer clic en los hipervínculos en un UITextView. Simplemente configura la casilla de verificación" detectar enlaces "en la vista en IB, y detecta enlaces http y los convierte en hipervínculos".
Mi experiencia (al menos en xcode 7) es que también debe desmarcar el comportamiento "Editable" para que las URL se detecten y se pueda hacer clic en ellas.
fuente
En caso de que tenga problemas con lo que @Karl Nosworthy y @esilver habían proporcionado anteriormente, he actualizado la extensión NSMutableAttributedString a su versión Swift 4.
fuente
La excelente biblioteca de @AliSoftware
OHAttributedStringAdditions
hace que sea fácil agregar enlacesUILabel
aquí es la documentación: https://github.com/AliSoftware/OHAttributedStringAdditions/wiki/link-in-UILabelfuente
Si desea usar NSLinkAttributeName en un UITextView, entonces puede considerar usar la biblioteca AttributedTextView. Es una subclase de UITextView que hace que sea muy fácil manejarlos. Para obtener más información, consulte: https://github.com/evermeer/AttributedTextView
Puede hacer que cualquier parte del texto interactúe de esta manera (donde textView1 es un UITextView IBoutlet):
Y para manejar hashtags y menciones puedes usar un código como este:
fuente
si desea una subcadena activa en su UITextView, puede usar mi TextView extendido ... es breve y simple. Puedes editarlo como quieras.
resultado:
código: https://github.com/marekmand/ActiveSubstringTextView
fuente
PUNTOS CLAVE:
fuente