ฉันสามารถเปลี่ยนสีของลิงก์ที่ตรวจพบอัตโนมัติบน UITextView ได้หรือไม่


115

ผมมีUITextViewที่ตรวจพบหมายเลขโทรศัพท์และเชื่อมโยง แต่แทนที่นี้ของฉันและเปลี่ยนเป็นfontColor blueColorมีวิธีจัดรูปแบบสีของลิงก์ที่ตรวจพบอัตโนมัติหรือไม่หรือฉันควรลองใช้ฟังก์ชันนี้ในเวอร์ชันคู่มือ


ตรวจสอบคำตอบนี้โดยใช้ UIWebDocumentView ย่อย private-api: stackoverflow.com/a/11745983/111277
situee

คำตอบ:


170

ใน iOS 7 คุณสามารถตั้งค่าtintColorไฟล์UITextView. มีผลต่อสีของลิงก์เช่นเดียวกับเส้นเคอร์เซอร์และสีข้อความที่เลือก

iOS 7 ยังเพิ่มคุณสมบัติใหม่ในการUITextViewเรียกlinkTextAttributesซึ่งจะช่วยให้คุณควบคุมรูปแบบลิงก์ได้อย่างเต็มที่


2
ฉันได้ให้คำอธิบายเพิ่มเติมในคำตอบนี้: stackoverflow.com/a/21027340/1202222
Tim Windsor Brown

บน iOS 10.3 ผมไม่สามารถที่จะแทนที่ด้วยNSFontAttributeName linkTextAttributesฉันต้องระบุแบบอักษรด้วยตนเองในช่วงเดียวกับNSLinkAttributeName
Heath Borders

37

แทนที่จะใช้ UITextView ฉันใช้ UIWebView และเปิดใช้งาน "ลิงก์ตรวจหาอัตโนมัติ" หากต้องการเปลี่ยนสีลิงก์เพียงแค่สร้าง CSS ปกติสำหรับแท็ก

ฉันใช้สิ่งนี้:

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
ดูเหมือนว่าจะแฮ็คอย่างมากสำหรับงานง่ายๆเช่นนี้
yuikonnu

ฉันรู้ ... แต่ฉันไม่รู้วิธีแก้ปัญหาใด ๆ ที่แฮ็กน้อยลง Apple ควรคิดถึงรายละเอียดเล็กน้อยเหล่านี้จริงๆ
Leandro Alves

@ ออสการ์ฉันคิดว่ามันแฮ็คน้อยกว่าที่อเล็กซานเดอร์ตอบ ยังคงบ้าที่ไม่มีคุณสมบัติง่ายๆสำหรับฟังก์ชันพื้นฐานเช่นนี้
Andy

1
คำถามเกี่ยวกับ textview ไม่ใช่ webview!
Boris Gafurov

เห็นด้วยอย่างยิ่งกับ "asdasd" วิธีการเว็บมีราคาแพงมากพวกเขาเพื่อดูว่ามันใช้ ram มากแค่ไหน สำหรับงานง่ายๆเช่นนี้ให้ใช้ textview และคุณสมบัติที่ Apple มอบให้
ingconti

37

คุณสามารถใช้UIAppearanceโปรโตคอลเพื่อใช้การเปลี่ยนแปลงสำหรับมุมมองข้อความทั้งหมด:

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

ลักษณะที่ปรากฏUITextViewไม่ได้รับการบันทึกไว้ แต่ใช้งานได้ดี

เก็บไว้ในใจUIAppearanceบันทึก:

iOS ใช้การเปลี่ยนแปลงลักษณะที่ปรากฏเมื่อมุมมองเข้าสู่หน้าต่าง แต่จะไม่เปลี่ยนลักษณะของมุมมองที่มีอยู่แล้วในหน้าต่าง หากต้องการเปลี่ยนลักษณะของมุมมองที่อยู่ในหน้าต่างให้ลบมุมมองออกจากลำดับชั้นของมุมมองแล้วนำกลับมา

ในคำอื่น ๆ : โทรรหัสนี้ในinit()หรือinit(coder:)วิธีการจะเปลี่ยนรูปลักษณ์ของวัตถุ UI แต่โทรในloadView()หรือviewDidLoad()ของ viewController จะไม่
หากคุณต้องการกำหนดลักษณะสำหรับแอปพลิเคชันทั้งหมดapplication(_:didFinishLaunchingWithOptions:)เป็นสถานที่ที่ดีสำหรับการเรียกรหัสดังกล่าว


ฉันชอบคำตอบนี้มากกว่าคำตอบที่เลือกเพราะฉันต้องการใช้สีอื่นสำหรับการเลือกเคอร์เซอร์ / ข้อความและลิงก์
Kevin R

นี่คือคำตอบที่ดีที่สุดและเป็นปัจจุบัน
yuzer

ฉันใช้ UITextView และเขียนโค้ดด้านบนใน viewdidload แต่เมื่อฉันเขียนอีเมลในช่องข้อความและป้อนสีของพื้นที่จะไม่เปลี่ยน
Raj Aggrawal

18

ปัญหาเกี่ยวกับ UITextView linkTextAttributesคือใช้กับลิงก์ที่ตรวจพบโดยอัตโนมัติทั้งหมด จะเป็นอย่างไรหากคุณต้องการให้ลิงก์ต่างๆมีคุณสมบัติที่แตกต่างกัน

มันจะเปิดออกมีเคล็ดลับ: การกำหนดค่าการเชื่อมโยงเป็นส่วนหนึ่งของข้อความประกอบมุมมองข้อความที่และการตั้งค่าlinkTextAttributesไปยังพจนานุกรมที่ว่างเปล่า

นี่คือตัวอย่างใน 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 = [:]

My String คือ "ต้องการเรียนรู้ iOS หรือไม่" คุณควรไปที่แหล่งที่ดีที่สุดของบทเรียน iOS ฟรี! การตรวจสอบอย่างรวดเร็วสวัสดีgoogle.comการทดสอบสตริงที่มีการระบุ 9826012345 ในการดำเนินการต่อ ... "และต้องมีแอตทริบิวต์ลิงก์เริ่มต้นสำหรับลิงก์เว็บและหมายเลขโทรศัพท์มือถือ แต่ฉันต้องการสร้างลิงก์สำหรับสตริงส่วน" ต้องการเรียนรู้ iOS หรือไม่ "ในสีที่ต่างกัน with link..So self.tv.linkTextAttributes = [:] ใช้งานได้กับลิงก์ที่กำหนดเองเท่านั้น
BalKrishan Yadav

14

คุณสามารถเปลี่ยนสีของไฮเปอร์ลิงก์ใน TextView ได้ดังต่อไปนี้:

ในไฟล์ Nib คุณสามารถไปที่หน้าต่างคุณสมบัติและเปลี่ยนสีเป็นสีที่คุณต้องการได้

หรือคุณสามารถทำแบบเป็นโปรแกรมได้โดยใช้รหัสด้านล่าง

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];


3

ฉันพบวิธีอื่นโดยไม่ใช้ webviewแต่โปรดทราบว่าสิ่งนี้ใช้API ส่วนตัวและอาจถูกปฏิเสธใน appstore:

แก้ไข:แอปของฉันได้รับการอนุมัติจาก apple แม้ว่าจะมีการใช้งาน API ส่วนตัว!

ก่อนอื่นให้ประกาศประเภทบน UITextView ด้วยวิธีการ

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

พวกเขากำลังทำสิ่งต่อไปนี้:

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

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

ตอนนี้เขียนวิธีการสำหรับลิงค์ที่มีสีสัน:

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

มันตั้งค่าแอตทริบิวต์สไตล์ด้วยสีเฉพาะสำหรับลิงก์ทุกประเภท

UITextViews จะแสดงผล Webiview เหมือนผ่าน divs เพื่อให้คุณสามารถไปได้ไกลขึ้นและทำสีของลิงค์แต่ละประเภทแยกกัน:

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

x-apple-data-detectors-type="link"เป็นตัวบ่งชี้สำหรับชนิดที่แน่นอนของการเชื่อมโยง

แก้ไข

บนiOS7นี้ใช้งานไม่ได้อีกต่อไป ใน iOS7 คุณสามารถเปลี่ยนสีลิงค์ของ UITextViews ได้อย่างง่ายดายโดยการตั้งค่าสีอ่อน คุณไม่ควรโทร

- (id)contentAsHTMLString;

อีกต่อไปคุณจะได้รับข้อยกเว้น ทำสิ่งต่อไปนี้แทนหากคุณต้องการรองรับ iOS 7 และต่ำกว่า:

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

}
}


0

แก้ไข: อย่าทำด้วยUITextViewใช้UIWebViewแทน

คุณต้องสร้างสไตล์ชีตสำหรับสิ่งนั้น กำหนดคลาสที่นั่นด้วยการผสมสีที่คุณต้องการ -

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

ตอนนี้ใช้คลาส 'headercopy' ในหน้า html ของคุณเช่นนี้ -

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

ซึ่งจะแสดงหมายเลขโทรศัพท์ด้วยสีที่คุณต้องการพร้อมฟังก์ชันการคลิก


การใช้มุมมองเว็บเป็นรูปแบบการเขียนโปรแกรมที่ไม่ดีสำหรับแอปที่มาพร้อมเครื่อง
ingconti

0

รหัสนี้จะกำหนดสีของหมายเลขโทรศัพท์บน I-Phone แต่ทำให้ลิงก์โทรอัตโนมัติเป็นโมฆะ

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

let attributedString = NSMutableAttributedString(string: myTextView.text ?? "")
myTextView.linkTextAttributes = [NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.whiteColor] as [NSAttributedString.Key: Any]?
myTextView.attributedText = attributedString
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.