Pregunta

Yo tenía un UITextView que detecta los números de teléfono y enlaces, pero esto anula mi fontColor y el cambio a blueColor. ¿Hay una manera de formatear el color de los enlaces automáticos detectado, o debería probar una versión manual de esta función?

¿Fue útil?

Solución

En iOS 7 se puede establecer el tintColor del UITextView. Afecta el color de los enlaces, así como la línea de cursor y el color del texto seleccionado.

iOS 7 también añade una nueva propiedad a UITextView llamada linkTextAttributes que aparecería le dejó controlar por completo el estilo de vínculo.

Otros consejos

En lugar de utilizar un UITextView, utilicé un UIWebView y permitió a la "auto-detectar enlaces". Para cambiar el color de los enlaces, que acaba de crear un CSS regular para la etiqueta.

he usado algo como esto:

NSString * htmlString = [NSString stringWithFormat:@"<html><head><script> document.ontouchmove = function(event) { if (document.body.scrollHeight == document.body.clientHeight) event.preventDefault(); } </script><style type='text/css'>* { margin:0; padding:0; } p { color:black; font-family:Helvetica; font-size:14px; } a { color:#63B604; text-decoration:none; }</style></head><body><p>%@</p></body></html>", [update objectForKey:@"text"]];
webText.delegate = self;
[webText loadHTMLString:htmlString baseURL:nil];

Puede usar el protocolo UIAppearance para aplicar los cambios para todas las vistas de texto:

4.x Swift:

UITextView.appearance().linkTextAttributes = [ .foregroundColor: UIColor.red ]

3.x Swift:

UITextView.appearance().linkTextAttributes = [ NSForegroundColorAttributeName: UIColor.red ]

2.x Swift:

UITextView.appearance().linkTextAttributes = [ NSForegroundColorAttributeName: UIColor.redColor() ]

Objetivo-C:

[UITextView appearance].linkTextAttributes = @{ NSForegroundColorAttributeName : UIColor.redColor };

Apariencia para UITextView no está documentada, pero funciona bien.

Tenga en mente UIAppearance notas:

  

IOS aplica apariencia cambia cuando entra en una vista de una ventana, no cambia la apariencia de una visión que ya está en una ventana. Para cambiar la apariencia de una vista que está actualmente en una ventana, quitar la vista de la jerarquía de la vista y luego ponerlo de nuevo.

En otras palabras: Al llamar a este código en init(), o métodos init(coder:) cambiar la interfaz de usuario apariencia del objeto, pero llamar en loadView() o viewDidLoad() de viewController no .
Si desea configurar el aspecto de toda la aplicación, application(_:didFinishLaunchingWithOptions:) es un buen lugar para llamar a dicho código.

Puede cambiar el color de hipervínculo en un TextView por lo siguiente:

En el archivo de plumilla, se puede ir a la ventana de propiedades y cambiar el matiz de acuerdo con el cual el color usted quiere.

o también puede hacerlo mediante programación utilizando el siguiente código

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];

El problema con UITextView linkTextAttributes es que se aplica a todos los enlaces automáticamente detectado. ¿Qué pasa si usted quiere diversas enlaces tengan diferentes atributos?

Resulta que hay un truco:. Configurar los enlaces como parte del texto atribuido de la vista de texto, y establecer el linkTextAttributes a un diccionario vacío

Este es un ejemplo en IOS 11 / Swift 4:

// mas is the mutable attributed string we are forming...
// ... and we're going to use as the text view's `attributedText`
mas.append(NSAttributedString(string: "LINK", attributes: [
    NSAttributedStringKey.link : URL(string: "https://www.apple.com")!,
    NSAttributedStringKey.foregroundColor : UIColor.green,
    NSAttributedStringKey.underlineStyle : NSUnderlineStyle.styleSingle.rawValue
]))
// ...
self.tv.attributedText = mas
// this is the important thing:
self.tv.linkTextAttributes = [:]

El color de la tinta se puede hacer en el guión gráfico también

introducir descripción de la imagen aquí

He encontrado de hecho otra manera sin usar una vista web pero tenga en cuenta que este utiliza API privada y pueden ser rechazados en la AppStore:

EDITAR: Mi aplicación quedó aprobado por Apple, aunque el uso de la API privada

En primer lugar declarar una categoría en UITextView con los métodos

- (id)contentAsHTMLString;
- (void)setContentToHTMLString:(id)arg1;

Ellos sólo están haciendo lo siguiente:

- (id)contentAsHTMLString;
{
    return [super contentAsHTMLString];
}

- (void)setContentToHTMLString:(id)arg1;
{
    [super setContentToHTMLString:arg1];
}

Ahora escribe un método para enlaces de colores:

- (void) colorfillLinks;
{
    NSString *contentString = [self.textViewCustomText contentAsHTMLString];
    contentString = [contentString stringByReplacingOccurrencesOfString:@"x-apple-data-detectors=\"true\""
                                         withString:@"x-apple-data-detectors=\"true\" style=\"color:white;\""];
    [self.textViewCustomText setContentToHTMLString:contentString];
}

No establece el atributo de estilo con un color específico en todos los tipos de enlaces.

UITextViews se prestan a través de Webiview como divs por lo que incluso podría ir más allá y colorear cada tipo de enlace por separado:

<div><a href="http://www.apple.com" x-apple-data-detectors="true" style="color:white;" x-apple-data-detectors-type="link" x-apple-data-detectors-result="0">http://www.apple.com</a></div>

El x-apple-data-detectors-type="link" es el indicador para el tipo exacto del enlace

Editar

En iOS7this ya no funciona. En iOS7 que podría cambiar fácilmente el color de los enlaces de UITextViews ajustando el color de la tinta. No se debe llamar

- (id)contentAsHTMLString;

más, obtendrá una excepción. En su lugar lo siguiente si quieres apoyar a iOS 7 y siguientes:

- (void) colorfillLinks;
{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.tintColor = [UIColor colorWithRed:79.0/255.0
                                     green:168.0/255.0
                                      blue:224.0/255.0
                                     alpha:1.0];
} else if(![self isFirstResponder ]) {
    NSString *contentString = [self contentAsHTMLString];
    contentString = [contentString stringByReplacingOccurrencesOfString:@"x-apple-data-detectors=\"true\""
                                                             withString:@"x-apple-data-detectors=\"true\" style=\"color:#DDDDDE;\""];
    [self setContentToHTMLString:contentString];

}
}

EDIT: No hacerlo con UITextView, utilice UIWebView lugar.

Es necesario hacer una hoja de estilo para eso. Definir una clase allí con la combinación de colores que necesitas,

.headercopy {
 font-family: "Helvetica";
 font-size: 14px;
 line-height: 18px;
 font-weight:bold;
 color: #25526e;
}
a.headercopy:link {
 color:#ffffff;
 text-decoration:none;
}
a.headercopy:hover {
 color:#00759B;
 text-decoration:none;
}
a.headercopy:visited {
 color:#ffffff;
 text-decoration:none;
} 
a.headercopy:hover {
 color:#00759B;
 text-decoration:none;
}

Ahora utilice la clase 'headercopy' en que la página HTML como este -

<b>Fax:</b><a href="tel:646.200.7535" class="headercopy"> 646-200-7535</a><br />

Esto mostrará el número de teléfono en el color que necesita con la funcionalidad de clic.

Este código se establecerá el color de un número de teléfono en un I-Phone, pero anula el enlace de llamada automática.

<div><a href="#" x-apple-data-detectors="true" style="color:white;" x-apple-data-detectors-type="link" x-apple-data-detectors-result="0">p&nbsp;&nbsp;0232 963 959</a></div>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top