Dapatkah saya mengubah warna tautan yang terdeteksi otomatis di UITextView?

115

Saya memiliki UITextViewyang mendeteksi nomor telepon dan tautan, tetapi ini menimpa saya fontColordan mengubahnya menjadi blueColor. Adakah cara untuk memformat warna tautan yang terdeteksi otomatis, atau haruskah saya mencoba versi manual dari fungsi ini?

Leandro Alves
sumber
Periksa jawaban ini menggunakan subview pribadi-api UIWebDocumentView: stackoverflow.com/a/11745983/111277
situee

Jawaban:

170

Di iOS 7 Anda dapat mengatur tintColorfile UITextView. Ini mempengaruhi warna link serta garis kursor dan warna teks yang dipilih.

iOS 7 juga menambahkan properti baru untuk UITextViewdipanggil linkTextAttributesyang tampaknya memungkinkan Anda mengontrol sepenuhnya gaya tautan.

stonemonk
sumber
2
Saya telah memberikan penjelasan lebih lanjut dalam jawaban ini: stackoverflow.com/a/21027340/1202222
Tim Windsor Brown
Di iOS 10.3, saya tidak dapat mengganti NSFontAttributeNamedengan linkTextAttributes. Saya harus menentukan jenis huruf secara manual dalam kisaran yang sama dengan sayaNSLinkAttributeName
Heath Borders
37

Alih-alih menggunakan UITextView, saya menggunakan UIWebView dan mengaktifkan "tautan deteksi otomatis". Untuk mengubah warna link, cukup buat CSS biasa untuk tag tersebut.

Saya menggunakan sesuatu seperti ini:

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
sumber
13
Ini tampaknya sangat hack untuk tugas sederhana seperti itu.
yuikonnu
Saya tahu ... tapi saya tidak tahu solusi apa pun yang kurang hackish. Apple harus benar-benar memikirkan detail kecil ini.
Leandro Alves
@Oscar baik, saya pikir itu kurang hackish dari jawaban Alexanders. Masih gila bahwa tidak ada properti sederhana untuk fungsi fundamental seperti itu.
Andy
1
Pertanyaannya adalah tentang textview bukan webview!
Boris Gafurov
sepenuhnya setuju dengan "asdasd". Pendekatan web sangat mahal, mereka melihat berapa banyak ram yang digunakannya. untuk tugas sederhana menggunakan textview dan properti yang diberikan Apple.
ingconti
37

Anda dapat menggunakan UIAppearanceprotokol untuk menerapkan perubahan pada semua tampilan teks:

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

Penampilan untuk UITextViewtidak didokumentasikan, tetapi berfungsi dengan baik.

Perhatikan UIAppearancecatatan:

iOS menerapkan perubahan tampilan saat tampilan memasuki jendela, tidak mengubah tampilan yang sudah ada di jendela. Untuk mengubah tampilan yang saat ini ada di jendela, hapus tampilan dari hierarki tampilan lalu letakkan kembali.

Dengan kata lain: Memanggil kode ini init(), atau init(coder:)metode akan mengubah tampilan Objek UI, tetapi memanggil loadView(), atau viewDidLoad()viewController tidak .
Jika Anda ingin mengatur tampilan untuk seluruh aplikasi, application(_:didFinishLaunchingWithOptions:)adalah tempat yang baik untuk memanggil kode tersebut.

Grubas
sumber
Saya lebih suka yang ini daripada jawaban yang dipilih, karena saya ingin menggunakan warna yang berbeda untuk pemilihan kursor / teks dan tautan
Kevin R
Ini adalah jawaban terbaik dan terkini.
yuzer
Saya telah menggunakan UITextView dan menulis kode di atas di viewdidload. tetapi ketika saya menulis email di bidang teks dan memasukkan warna spasi tidak berubah.
Raj Aggrawal
18

Masalah dengan UITextView linkTextAttributesadalah bahwa ini berlaku untuk semua tautan yang terdeteksi secara otomatis. Bagaimana jika Anda ingin tautan yang berbeda memiliki atribut yang berbeda?

Ternyata ada triknya: konfigurasikan tautan sebagai bagian dari teks atribut tampilan teks, dan setel linkTextAttributeske kamus kosong .

Berikut contoh di 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 = [:]
Matt
sumber
String saya adalah "Ingin belajar iOS?" Anda harus mengunjungi sumber terbaik tutorial iOS gratis! Pengecekan cepat halo google.com Diatribusikan 9826012345 Pengujian string sedang berlangsung ... "dan Atribut tautan default diperlukan untuk tautan web dan nomor ponsel. Tetapi saya ingin membuat tautan untuk bagian string" Ingin belajar iOS? "Dengan warna berbeda with link..So self.tv.linkTextAttributes = [:] hanya bekerja untuk link kustom.
BalKrishan Yadav
14

Anda dapat Mengubah Warna Hyperlink dalam TextView dengan cara berikut:

Di file Nib, Anda dapat pergi ke Properties Window dan mengubah Tint menjadi warna yang Anda inginkan.

atau Anda juga dapat melakukannya secara terprogram dengan menggunakan kode di bawah ini

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];
Manju
sumber
5

Warna tint juga bisa dilakukan di storyboard

masukkan deskripsi gambar di sini

Ryan Heitner
sumber
3

Saya memang menemukan cara lain tanpa menggunakan tampilan web tetapi perlu diingat bahwa ini menggunakan API pribadi dan mungkin ditolak di appstore:

EDIT: Aplikasi saya disetujui oleh apel meskipun penggunaan api pribadi!

Pertama-tama deklarasikan kategori di UITextView dengan metode

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

Mereka hanya melakukan hal berikut:

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

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

Sekarang tulis metode untuk tautan berwarna:

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

Itu mengatur atribut gaya dengan warna tertentu pada semua jenis tautan.

UITextView dirender seperti Webiview melalui div sehingga Anda bahkan dapat melangkah lebih jauh dan mewarnai setiap jenis tautan secara terpisah:

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

Ini x-apple-data-detectors-type="link"adalah indikator untuk jenis tautan yang tepat

EDIT

Pada iOS7ini bekerja tidak lagi. Di iOS7 Anda dapat dengan mudah mengubah warna tautan UITextView dengan menyetel warna tint. Anda tidak harus menelepon

- (id)contentAsHTMLString;

lagi, Anda akan mendapatkan pengecualian. Sebagai gantinya lakukan hal berikut jika Anda ingin mendukung iOS 7 dan yang lebih lama:

- (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
sumber
3

Swift 5 Answer

Bagus dan sederhana

myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]
Mark Wilson
sumber
0

EDIT: Jangan lakukan dengan UITextView, gunakan UIWebViewsaja.

Anda perlu membuat lembar gaya untuk itu. Tentukan kelas di sana dengan kombinasi warna yang Anda butuhkan-

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

sekarang gunakan kelas 'headercopy' ke halaman html Anda seperti ini-

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

ini akan menampilkan nomor telepon dalam warna yang Anda butuhkan dengan fungsi klik.

Vaibhav Saran
sumber
menggunakan tampilan web adalah gaya pemrograman yang buruk untuk aplikasi asli.
ingconti
0

Kode ini akan menyetel warna nomor telepon di I-Phone tetapi membatalkan tautan panggilan otomatis.

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

Beginilah cara saya melakukannya menggunakan 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
sumber