ผมมีUITextView
ที่ตรวจพบหมายเลขโทรศัพท์และเชื่อมโยง แต่แทนที่นี้ของฉันและเปลี่ยนเป็นfontColor
blueColor
มีวิธีจัดรูปแบบสีของลิงก์ที่ตรวจพบอัตโนมัติหรือไม่หรือฉันควรลองใช้ฟังก์ชันนี้ในเวอร์ชันคู่มือ
ผมมีUITextView
ที่ตรวจพบหมายเลขโทรศัพท์และเชื่อมโยง แต่แทนที่นี้ของฉันและเปลี่ยนเป็นfontColor
blueColor
มีวิธีจัดรูปแบบสีของลิงก์ที่ตรวจพบอัตโนมัติหรือไม่หรือฉันควรลองใช้ฟังก์ชันนี้ในเวอร์ชันคู่มือ
คำตอบ:
ใน iOS 7 คุณสามารถตั้งค่าtintColor
ไฟล์UITextView
. มีผลต่อสีของลิงก์เช่นเดียวกับเส้นเคอร์เซอร์และสีข้อความที่เลือก
iOS 7 ยังเพิ่มคุณสมบัติใหม่ในการUITextView
เรียกlinkTextAttributes
ซึ่งจะช่วยให้คุณควบคุมรูปแบบลิงก์ได้อย่างเต็มที่
NSFontAttributeName
linkTextAttributes
ฉันต้องระบุแบบอักษรด้วยตนเองในช่วงเดียวกับNSLinkAttributeName
แทนที่จะใช้ 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];
คุณสามารถใช้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:)
เป็นสถานที่ที่ดีสำหรับการเรียกรหัสดังกล่าว
ปัญหาเกี่ยวกับ 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 = [:]
คุณสามารถเปลี่ยนสีของไฮเปอร์ลิงก์ใน TextView ได้ดังต่อไปนี้:
ในไฟล์ Nib คุณสามารถไปที่หน้าต่างคุณสมบัติและเปลี่ยนสีเป็นสีที่คุณต้องการได้
หรือคุณสามารถทำแบบเป็นโปรแกรมได้โดยใช้รหัสด้านล่าง
[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];
ฉันพบวิธีอื่นโดยไม่ใช้ 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];
}
}
คำตอบ Swift 5
สวยและเรียบง่าย
myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]
แก้ไข:
อย่าทำด้วย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 />
ซึ่งจะแสดงหมายเลขโทรศัพท์ด้วยสีที่คุณต้องการพร้อมฟังก์ชันการคลิก
รหัสนี้จะกำหนดสีของหมายเลขโทรศัพท์บน 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 0232 963 959</a></div>
นี่คือวิธีที่ฉันใช้ 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