iphone - pantalla - ¿Puedo cambiar el color de los enlaces detectados automáticamente en UITextView?
como cambiar el color de safari en iphone (9)
De hecho, encontré otra manera sin usar una vista web, pero tenga en cuenta que esto utiliza una API privada y puede ser rechazada en la tienda de aplicaciones:
EDITAR: ¡ Mi aplicación fue aprobada por Apple a pesar del uso privado de API!
Primero declara una categoría en UITextView con los métodos
- (id)contentAsHTMLString;
- (void)setContentToHTMLString:(id)arg1;
Ellos solo están haciendo lo siguiente:
- (id)contentAsHTMLString;
{
return [super contentAsHTMLString];
}
- (void)setContentToHTMLString:(id)arg1;
{
[super setContentToHTMLString:arg1];
}
Ahora escribe un método para enlaces coloridos:
- (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];
}
Establece el atributo de estilo con un color específico en todos los tipos de enlaces.
UITextViews se renderizan como Webiview a través de 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 del tipo exacto del enlace
EDITAR
En iOS7
esto ya no funciona. En iOS7, puede cambiar fácilmente el color del enlace de UITextViews configurando el color del tinte. No deberías llamar
- (id)contentAsHTMLString;
nunca más, obtendrás una excepción. En su lugar, haga lo siguiente si desea admitir 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];
}
}
Tenía una UITextView
que detecta números de teléfono y enlaces, pero esto anula my fontColor
y lo cambia a blueColor
. ¿Hay alguna manera de formatear el color de los enlaces detectados automáticamente, o debería probar una versión manual de esta función?
El problema con UITextView linkTextAttributes
es que se aplica a todos los enlaces detectados automáticamente. ¿Qué pasa si quieres que diferentes 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
en un diccionario vacío .
Aquí hay 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 = [:]
En iOS 7 puedes establecer el tintColor
de UITextView
. Afecta el color del enlace, así como la línea del cursor y el color del texto seleccionado.
iOS 7 también agregó una nueva propiedad a UITextView
llamada linkTextAttributes
que parece permitirle controlar completamente el estilo del enlace.
En lugar de utilizar una UITextView, utilicé UIWebView y habilité los "enlaces de detección automática". Para cambiar el color del enlace, acaba de crear un CSS regular para la etiqueta.
Usé 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];
Este código establecerá el color de un número de teléfono en un I-Phone pero anulará 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 0232 963 959</a></div>
Puede cambiar el color del hipervínculo en una vista de texto de la siguiente manera:
En el archivo Nib, puede ir a la Ventana de Propiedades y cambiar el Tinte a cualquier color que desee.
o también puede hacerlo programáticamente utilizando el siguiente código
[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];
Puede usar el protocolo UIAppearance
para aplicar cambios a todas las vistas de texto:
Swift 4.x:
UITextView.appearance().linkTextAttributes = [ NSAttributedStringKey.foregroundColor.rawValue: UIColor.red ]
Swift 3.x:
UITextView.appearance().linkTextAttributes = [ NSForegroundColorAttributeName: UIColor.red ]
Swift 2.x:
UITextView.appearance().linkTextAttributes = [ NSForegroundColorAttributeName: UIColor.redColor() ]
C objetivo:
[UITextView appearance].linkTextAttributes = @{ NSForegroundColorAttributeName : UIColor.redColor };
La apariencia de UITextView
no está documentada, pero funciona bien.
Tenga en cuenta UIAppearance
notas de UIAppearance
:
iOS aplica cambios de apariencia cuando una vista ingresa a una ventana, no cambia la apariencia de una vista que ya está en una ventana. Para cambiar la apariencia de una vista que se encuentra actualmente en una ventana, elimine la vista de la jerarquía de vistas y luego vuelva a colocarla.
En otras palabras: Llamar a este código en los métodos init()
o init(coder:)
cambiará la apariencia del objeto UI, pero la invocación de loadView()
o viewDidLoad()
de viewController no lo hará .
Si desea establecer la apariencia para toda la aplicación, la application(_:didFinishLaunchingWithOptions:)
es un buen lugar para llamar a dicho código.
EDITAR: No lo haga con UITextView
, use UIWebView
en UIWebView
lugar.
Necesitas hacer una hoja de estilo para eso. Defina una clase allí con la combinación de colores que necesita-
.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 usa la clase ''headercopy'' en tu página html como esta-
<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.