UITextView'da otomatik olarak algılanan bağlantıların rengini değiştirebilir miyim?


115

UITextViewTelefon numaralarını ve bağlantıları algılayan bir cihazım vardı , ancak bu benim yerine geçer fontColorve olarak değiştirir blueColor. Otomatik olarak algılanan bağlantıların rengini biçimlendirmenin bir yolu var mı, yoksa bu işlevin manuel sürümünü denemeli miyim?


Özel bir api alt görünümü kullanarak bu yanıtı kontrol edin UIWebDocumentView: stackoverflow.com/a/11745983/111277
situee

Yanıtlar:


170

İOS 7 üzerinde ayarlayabileceğiniz tintColorbir UITextView. Bağ renginin yanı sıra imleç çizgisini ve seçilen metin rengini de etkiler.

iOS 7 de yeni bir özellik eklendi UITextViewdenilen linkTextAttributestam bağlantı tarzını kontrol etmesine izin görünecektir.


2
Bu cevapta daha fazla açıklama yaptım: stackoverflow.com/a/21027340/1202222
Tim Windsor Brown

İOS 10.3, ben geçersiz kılmak mümkün değildi NSFontAttributeNameile linkTextAttributes. Yazı tipini benimNSLinkAttributeName
Heath Borders

37

Bir UITextView kullanmak yerine, bir UIWebView kullandım ve "bağlantıları otomatik algılamayı" etkinleştirdim. Bağ rengini değiştirmek için etiket için normal bir CSS oluşturduk.

Bunun gibi bir şey kullandım:

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

13
Bu, bu kadar basit bir görev için son derece hilekar görünüyor.
yuikonnu

Biliyorum ... ama daha az hackli bir çözüm bilmiyorum. Apple bu küçük ayrıntıları gerçekten düşünmeli.
Leandro Alves

@Oscar iyi, bence İskender'in cevabından daha az zekice. Yine de bu kadar temel bir işlevsellik için basit bir özellik olmaması çılgınca.
Andy

1
soru metin görünümü ile ilgili değil, web görünümü ile ilgili!
Boris Gafurov

"asdasd" ile tamamen katılıyorum. Web yaklaşımı çok pahalıdır, ne kadar ram kullandığını görmek için. böylesine basit bir görev için Apple'ın verdiği metin görünümünü ve özellikleri kullanın.
ingconti

37

UIAppearanceTüm metin görünümlerine değişiklikleri uygulamak için protokolü kullanabilirsiniz :

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

Objective-C:

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

Görünüşü UITextViewbelgelenmedi, ancak iyi çalışıyor.

UIAppearanceNotları aklınızda bulundurun :

iOS, görünüm bir pencereye girdiğinde görünüm değişikliklerini uygular, zaten bir pencerede bulunan görünümün görünümünü değiştirmez. O anda bir pencerede bulunan bir görünümün görünümünü değiştirmek için, görünümü görünüm hiyerarşisinden kaldırın ve ardından geri koyun.

Başka bir deyişle: Bu kodu çağrılması init()veya init(coder:)yöntemler olacaktır UI Nesne görünümünü değiştirir ancak çağırarak loadView()veya viewDidLoad()viewController ait olmaz .
Tüm uygulama için görünümü ayarlamak istiyorsanız, application(_:didFinishLaunchingWithOptions:)bu tür kodu aramak için iyi bir yerdir.


İmleç / metin seçimi ve bağlantılar için farklı bir renk kullanmak istediğimden, bunu seçilen cevaba tercih ediyorum
Kevin R

Bu en iyi ve güncel cevaptır.
yuzer

Bir UITextView kullanıyorum ve viewdidload'da yukarıdaki kodu yazıyorum. ancak metin alanına e-posta yazdığımda ve boşluk girdiğimde rengi değişmiyor.
Raj Aggrawal

18

UITextView ile ilgili sorun, linkTextAttributesotomatik olarak algılanan tüm bağlantılar için geçerli olmasıdır. Ya farklı bağlantıların farklı niteliklere sahip olmasını istiyorsanız?

Metin görünümün atfedilen metnin bir parçası olarak yapılandırmak bağlantıları,: Bu bir hile var çıkıyor ve set linkTextAttributesboş sözlüğe .

İşte iOS 11 / Swift 4'te bir örnek:

// 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 = [:]

Dizim "iOS öğrenmek mi istiyorsunuz?" Ücretsiz iOS eğitimlerinin en iyi kaynağını ziyaret etmelisiniz! Hızlıca merhaba google.com'u kontrol ediyor Attributed 9826012345 Dize testi devam ediyor ... "ve web bağlantısı ve cep telefonu numarası için Varsayılan bağlantı özelliği gerekiyor. Ancak" iOS öğrenmek ister misiniz? "Dize bölümü için farklı renkte bir bağlantı yapmak istiyorum link..So self.tv.linkTextAttributes = [:] yalnızca özel bağlantı için çalışıyor.
BalKrishan Yadav

14

Bir TextView'daki Köprü Rengini aşağıdakileri yaparak değiştirebilirsiniz:

Uç dosyasında, Özellikler Penceresine gidip Renk Tonu'nu istediğiniz renge değiştirebilirsiniz.

veya aşağıdaki kodu kullanarak programlı olarak da yapabilirsiniz

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];


3

Bir web görünümü kullanmadan gerçekten başka bir yol buldum, ancak bunun özel API kullandığını ve uygulama mağazasında reddedilebileceğini unutmayın:

DÜZENLEME: Özel api kullanımına rağmen uygulamam apple tarafından onaylandı!

İlk önce yöntemlerle UITextView üzerinde bir kategori bildirin

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

Sadece şunları yapıyorlar:

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

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

Şimdi renkli bağlantılar için bir yöntem yazın:

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

Stil niteliğini tüm bağlantı türlerinde belirli bir renkle ayarlar.

UITextView'lar Webiview gibi div'ler aracılığıyla oluşturulur, böylece daha da ileri gidebilir ve her bağlantı türünü ayrı ayrı renklendirebilirsiniz:

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

Bağlantının x-apple-data-detectors-type="link"tam türünün göstergesidir

DÜZENLE

Açık iOS7bu artık çalışmıyor. İOS7'de, ton rengini ayarlayarak UITextView'ların bağlantı rengini kolayca değiştirebilirsiniz. Aramamalısın

- (id)contentAsHTMLString;

artık bir istisna alacaksın. Bunun yerine, iOS 7 ve altını desteklemek istiyorsanız aşağıdakileri yapın:

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

}
}

3

Swift 5 Cevap

Güzel ve basit

myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]

0

DÜZENLEME: Onunla yapmayın UITextView, UIWebViewonun yerine kullanın.

Bunun için bir stil sayfası yapmalısın. Orada ihtiyacınız olan renk kombinasyonu ile bir sınıf tanımlayın.

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

şimdi html sayfanıza bunun gibi 'headercopy' sınıfını kullanın-

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

bu, telefon numarasını tıklama işlevi ile ihtiyacınız olan renkte gösterecektir.


web görünümlerini kullanmak yerel uygulamalar için kötü bir programlama tarzıdır.
ingconti

0

Bu kod, bir I-Telefon üzerindeki bir telefon numarasının rengini belirler ancak otomatik arama bağlantısını geçersiz kılar.

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

0

Swift 5 kullanarak bunu böyle yaptım:

let attributedString = NSMutableAttributedString(string: myTextView.text ?? "")
myTextView.linkTextAttributes = [NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.whiteColor] as [NSAttributedString.Key: Any]?
myTextView.attributedText = attributedString
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.