Czy mogę zmienić kolor automatycznie wykrytych linków w UITextView?

115

Miałem, UITextViewktóry wykrywa numery telefonów i linki, ale to zastępuje mój fontColori zmienia go na blueColor. Czy istnieje sposób na sformatowanie koloru automatycznie wykrytych linków, czy powinienem wypróbować ręczną wersję tej funkcji?

Leandro Alves
źródło
Sprawdź tę odpowiedź, używając widoku podrzędnego private-api UIWebDocumentView: stackoverflow.com/a/11745983/111277
situee

Odpowiedzi:

170

IOS 7 można ustawić tintColorz UITextView. Wpływa na kolor łącza, a także linię kursora i wybrany kolor tekstu.

W systemie iOS 7 dodano również nową właściwość do UITextViewwywołania, linkTextAttributesktóra wydaje się pozwalać w pełni kontrolować styl łącza.

stonemonk
źródło
2
Dałem dalsze wyjaśnienie w tej odpowiedzi: stackoverflow.com/a/21027340/1202222
Tim Windsor Brown
IOS 10.3, nie był w stanie przesłonić NSFontAttributeNamez linkTextAttributes. Musiałem ręcznie określić czcionkę w tym samym zakresie, co mójNSLinkAttributeName
Heath Borders
37

Zamiast używać UITextView, użyłem UIWebView i włączyłem „automatyczne wykrywanie linków”. Aby zmienić kolor linku, właśnie utworzyłem zwykły CSS dla tagu.

Użyłem czegoś takiego:

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];
Leandro Alves
źródło
13
Wydaje się to niezwykle hakerskie jak na tak proste zadanie.
yuikonnu
Wiem ... ale nie znam żadnego mniej hakerskiego obejścia. Apple powinno naprawdę pomyśleć o tych drobnych szczegółach.
Leandro Alves
@Oscar cóż, myślę, że jest mniej hakerski niż odpowiedź Aleksandra. Wciąż szalony, że nie ma prostej właściwości dla tak podstawowej funkcjonalności.
Andy
1
pytanie dotyczy widoku tekstowego, a nie widoku internetowego!
Boris Gafurov,
całkowicie zgadzam się z „asdasd”. Podejście internetowe jest bardzo kosztowne, aby sprawdzić, ile pamięci RAM używa. do tak prostego zadania użyj widoku tekstu i właściwości, które podaje Apple.
ingconti
37

Możesz użyć UIAppearanceprotokołu, aby zastosować zmiany do wszystkich widoków tekstu:

Swift 4.x:

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

Swift 3.x:

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

Swift 2.x:

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

Cel C:

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

Wygląd UITextViewnie jest udokumentowany, ale działa dobrze.

Pamiętaj o UIAppearanceuwagach:

iOS stosuje zmiany wyglądu, gdy widok wchodzi do okna, nie zmienia to wyglądu widoku, który jest już w oknie. Aby zmienić wygląd widoku, który jest obecnie w oknie, usuń widok z hierarchii widoków, a następnie umieść go z powrotem.

Innymi słowy: Wywołanie tej kod init(), lub init(coder:)metody będzie zmienić UI wygląd obiektu, ale dzwoniąc loadView()lub viewDidLoad()od viewController nie będzie .
Jeśli chcesz ustawić wygląd całej aplikacji, application(_:didFinishLaunchingWithOptions:)to dobre miejsce na wywołanie takiego kodu.

Grubas
źródło
Wolę ten od wybranej odpowiedzi, ponieważ chcę użyć innego koloru dla kursora / zaznaczenia tekstu i linków
Kevin R
To najlepsza i aktualna odpowiedź.
yuzer
Używam UITextView i piszę powyższy kod w viewdidload. ale kiedy piszę e-mail w polu tekstowym i wpisuję spację, kolor się nie zmienia.
Raj Aggrawal
18

Problem z UITextView linkTextAttributespolega na tym, że dotyczy on wszystkich automatycznie wykrytych linków. A co jeśli chcesz, aby różne linki miały różne atrybuty?

Okazuje się, że jest pewna sztuczka: skonfiguruj linki jako część tekstu przypisanego do widoku tekstu i ustaw linkTextAttributesjako pusty słownik .

Oto przykład w 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 = [:]
matowe
źródło
Mój ciąg to „Chcesz się nauczyć iOS?” Powinieneś odwiedzić najlepsze źródło bezpłatnych samouczków iOS! Szybkie sprawdzanie hello google.com Przypisane 9826012345 Testowanie ciągu znaków w toku ... ”i domyślny atrybut linku jest wymagany dla linku internetowego i numeru telefonu komórkowego. Chcę jednak utworzyć link do części ciągu„ Chcesz nauczyć się iOS? ”W innym kolorze with link..So self.tv.linkTextAttributes = [:] działa tylko z niestandardowym łączem.
BalKrishan Yadav
14

Możesz zmienić kolor hiperłącza w TextView w następujący sposób:

W pliku Nib możesz przejść do okna Właściwości i zmienić Tintę na dowolny kolor.

lub możesz to zrobić programowo, używając poniższego kodu

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];
Manju
źródło
5

Kolor odcienia można również wykonać w serii ujęć

wprowadź opis obrazu tutaj

Ryan Heitner
źródło
3

Znalazłem rzeczywiście inny sposób bez korzystania z widoku internetowego, ale pamiętaj, że korzysta z prywatnego interfejsu API i może zostać odrzucony w Appstore:

EDYCJA: Moja aplikacja została zatwierdzona przez Apple, chociaż prywatne użycie API!

Najpierw zadeklaruj kategorię w UITextView za pomocą metod

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

Robią tylko następujące rzeczy:

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

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

Teraz napisz metodę na kolorowe linki:

- (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];
}

Ustawia atrybut stylu na określony kolor we wszystkich typach linków.

UITextViews są renderowane Webiview jak za pomocą elementów div, więc możesz pójść dalej i pokolorować każdy typ linku osobno:

<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>

To x-apple-data-detectors-type="link"wskaźnik dokładnego typu linku

EDYTOWAĆ

Na iOS7tym już nie działa. W iOS7 możesz łatwo zmienić kolor linku UITextViews, ustawiając kolor odcienia. Nie powinieneś dzwonić

- (id)contentAsHTMLString;

już będziesz miał wyjątek. Zamiast tego wykonaj następujące czynności, jeśli chcesz obsługiwać system iOS 7 i poniżej:

- (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];

}
}
Alexander
źródło
3

Szybka odpowiedź 5

Ładnie i prosto

myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]
Mark Wilson
źródło
0

EDYCJA: Nie rób tego za pomocą UITextView, użyj UIWebViewzamiast tego.

Musisz do tego stworzyć arkusz stylów. Zdefiniuj tam klasę z potrzebną kombinacją kolorów-

.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;
}

teraz użyj klasy 'headercopy' na swojej stronie html w ten sposób-

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

Spowoduje to wyświetlenie numeru telefonu w wybranym kolorze z funkcją klikania.

Vaibhav Saran
źródło
korzystanie z widoków internetowych to zły styl programowania dla aplikacji natywnych.
ingconti
0

Ten kod ustawi kolor numeru telefonu w I-Phone, ale unieważnia automatyczne łącze połączenia.

<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>
Mark Overton
źródło
0

Oto jak to zrobiłem używając Swift 5:

let attributedString = NSMutableAttributedString(string: myTextView.text ?? "")
myTextView.linkTextAttributes = [NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.whiteColor] as [NSAttributedString.Key: Any]?
myTextView.attributedText = attributedString
jaytrixz
źródło