Miałem, UITextView
który wykrywa numery telefonów i linki, ale to zastępuje mój fontColor
i zmienia go na blueColor
. Czy istnieje sposób na sformatowanie koloru automatycznie wykrytych linków, czy powinienem wypróbować ręczną wersję tej funkcji?
Miałem, UITextView
który wykrywa numery telefonów i linki, ale to zastępuje mój fontColor
i zmienia go na blueColor
. Czy istnieje sposób na sformatowanie koloru automatycznie wykrytych linków, czy powinienem wypróbować ręczną wersję tej funkcji?
Odpowiedzi:
IOS 7 można ustawić tintColor
z 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 UITextView
wywołania, linkTextAttributes
która wydaje się pozwalać w pełni kontrolować styl łącza.
NSFontAttributeName
z linkTextAttributes
. Musiałem ręcznie określić czcionkę w tym samym zakresie, co mójNSLinkAttributeName
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];
Możesz użyć UIAppearance
protokoł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 UITextView
nie jest udokumentowany, ale działa dobrze.
Pamiętaj o UIAppearance
uwagach:
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.
Problem z UITextView linkTextAttributes
polega 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 linkTextAttributes
jako 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 = [:]
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 iOS7
tym 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];
}
}
Szybka odpowiedź 5
Ładnie i prosto
myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]
EDYCJA:
Nie rób tego za pomocą UITextView
, użyj UIWebView
zamiast 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.
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 0232 963 959</a></div>
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