Tôi có thể thay đổi màu của các liên kết được phát hiện tự động trên UITextView không?


115

Tôi đã có một UITextViewphát hiện số điện thoại và liên kết, nhưng điều này sẽ ghi đè của tôi fontColorvà thay đổi nó thành blueColor. Có cách nào để định dạng màu sắc của các liên kết được tự động phát hiện hay tôi nên thử phiên bản thủ công của chức năng này?


Kiểm tra câu trả lời này bằng cách sử dụng UIWebDocumentView chế độ xem phụ private-api: stackoverflow.com/a/11745983/111277
situee

Câu trả lời:


170

Trên iOS 7, bạn có thể thiết lập tintColorcác UITextView. Nó ảnh hưởng đến màu liên kết cũng như dòng con trỏ và màu văn bản đã chọn.

iOS 7 cũng đã thêm một thuộc tính mới vào UITextViewtên gọi linkTextAttributes, thuộc tính này sẽ cho phép bạn kiểm soát hoàn toàn kiểu liên kết.


2
Tôi đã trao giải thích thêm trong câu trả lời này: stackoverflow.com/a/21027340/1202222
Tim Windsor Brown

Trên iOS 10.3, tôi không thể ghi đè NSFontAttributeNamevới linkTextAttributes. Tôi phải chỉ định phông chữ theo cách thủ công trong cùng phạm vi với của tôiNSLinkAttributeName
Heath Borders,

37

Thay vì sử dụng UITextView, tôi đã sử dụng UIWebView và bật "liên kết tự động phát hiện". Để thay đổi màu liên kết, chỉ cần tạo CSS thông thường cho thẻ.

Tôi đã sử dụng một cái gì đó như thế này:

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
Điều này có vẻ cực kỳ khó hiểu đối với một nhiệm vụ đơn giản như vậy.
yuikonnu

Tôi biết ... nhưng tôi không biết bất kỳ cách giải quyết nào ít hackish hơn. Apple thực sự nên suy nghĩ về những chi tiết nhỏ này.
Leandro Alves

@Oscar tốt, tôi nghĩ nó ít hack hơn câu trả lời của Alexanders. Vẫn còn điên rồ rằng không có thuộc tính đơn giản nào cho một chức năng cơ bản như vậy.
Andy

1
câu hỏi là về textview không phải webview!
Boris Gafurov 17/10/13

hoàn toàn đồng ý với "asdasd". Cách tiếp cận web rất tốn kém, họ phải xem nó sử dụng bao nhiêu ram. cho một tác vụ đơn giản như vậy, hãy sử dụng textview và các thuộc tính mà Apple cung cấp.
ingconti

37

Bạn có thể sử dụng UIAppearancegiao thức để áp dụng các thay đổi cho tất cả các chế độ xem văn bản:

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

Mục tiêu-C:

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

Giao diện cho UITextViewkhông được ghi lại, nhưng hoạt động tốt.

Hãy UIAppearanceghi nhớ các lưu ý:

iOS áp dụng các thay đổi giao diện khi một chế độ xem đi vào cửa sổ, nó không thay đổi giao diện của một chế độ xem đã có trong một cửa sổ. Để thay đổi giao diện của một dạng xem hiện đang ở trong một cửa sổ, hãy xóa dạng xem đó khỏi hệ thống phân cấp dạng xem và sau đó đặt nó trở lại.

Nói cách khác: Gọi mã này trong init()hoặc init(coder:)các phương thức sẽ thay đổi giao diện của Đối tượng giao diện người dùng, nhưng gọi vào loadView()hoặc viewDidLoad()của viewController thì không .
Nếu bạn muốn thiết lập giao diện cho toàn bộ ứng dụng, thì đây application(_:didFinishLaunchingWithOptions:)là nơi tốt để gọi mã như vậy.


Tôi thích câu này hơn câu trả lời đã chọn, vì tôi muốn sử dụng màu khác cho lựa chọn con trỏ / văn bản và các liên kết
Kevin R

Đây là câu trả lời tốt nhất và cập nhật.
yuzer

Tôi đã sử dụng UITextView và viết mã trên trong viewdidload. nhưng khi tôi viết email trong trường văn bản và nhập khoảng trắng màu không thay đổi.
Raj Aggrawal

18

Vấn đề với UITextView linkTextAttributeslà nó áp dụng cho tất cả các liên kết được phát hiện tự động. Điều gì xảy ra nếu bạn muốn các liên kết khác nhau có các thuộc tính khác nhau?

Hóa ra có một mẹo: định cấu hình các liên kết như một phần của văn bản được gán cho chế độ xem văn bản và đặt nó linkTextAttributesthành một từ điển trống .

Đây là một ví dụ trong 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 = [:]

Chuỗi của tôi là "Bạn muốn học iOS?" Bạn nên truy cập nguồn hướng dẫn iOS miễn phí tốt nhất! Kiểm tra nhanh xin chào google.com Thuộc tính 9826012345 Đang tiến hành kiểm tra chuỗi ... "và thuộc tính Liên kết mặc định là bắt buộc cho liên kết web và số điện thoại di động. Nhưng tôi muốn tạo liên kết cho phần chuỗi" Muốn học iOS? "Bằng màu khác với link..So self.tv.linkTextAttributes = [:] đang làm việc chỉ dành cho liên kết tùy chỉnh.
BalKrishan Yadav

14

Bạn có thể thay đổi màu siêu kết nối trong TextView bằng cách sau:

Trong tệp Nib, bạn có thể đi tới Cửa sổ Thuộc tính và thay đổi Màu sắc thành màu mà bạn muốn.

hoặc bạn cũng có thể làm điều đó theo chương trình bằng cách sử dụng mã bên dưới

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];


3

Tôi thực sự đã tìm thấy một cách khác mà không cần sử dụng chế độ xem web nhưng hãy nhớ rằng cách này sử dụng API riêng tư và có thể bị từ chối trong appstore:

CHỈNH SỬA: Ứng dụng của tôi đã được apple phê duyệt mặc dù sử dụng api riêng!

Đầu tiên khai báo một danh mục trên UITextView bằng các phương thức

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

Họ chỉ đang làm những việc sau:

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

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

Bây giờ hãy viết một phương thức cho các liên kết đầy màu sắc:

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

Nó thiết lập thuộc tính style với một màu cụ thể trên tất cả các loại liên kết.

UITextViews được hiển thị Webiview giống như thông qua divs, vì vậy bạn thậm chí có thể đi xa hơn và tô màu cho từng loại liên kết riêng biệt:

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

Đây x-apple-data-detectors-type="link"là chỉ báo cho loại chính xác của liên kết

BIÊN TẬP

Trên iOS7này không còn hoạt động. Trong iOS7, bạn có thể dễ dàng thay đổi màu liên kết của UITextViews bằng cách thiết lập màu sắc. Bạn không nên gọi

- (id)contentAsHTMLString;

nữa, bạn sẽ nhận được một ngoại lệ. Thay vào đó, hãy làm như sau nếu bạn muốn hỗ trợ iOS 7 trở xuống:

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

Câu trả lời Swift 5

Đẹp và đơn giản

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

0

CHỈNH SỬA: Đừng làm điều đó với UITextView, hãy sử dụng UIWebViewthay thế.

Bạn cần tạo một biểu định kiểu cho điều đó. Xác định một lớp ở đó với sự kết hợp màu sắc mà bạn cầ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;
}

bây giờ sử dụng lớp 'headercopy' vào trang html của bạn như thế này-

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

điều này sẽ hiển thị số điện thoại bằng màu bạn cần với chức năng nhấp chuột.


sử dụng chế độ xem web là một phong cách lập trình tồi cho các ứng dụng gốc.
ingconti

0

Mã này sẽ đặt màu của số điện thoại trên I-Phone nhưng làm mất tác dụng của liên kết cuộc gọi tự động.

<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

Đây là cách tôi đã làm điều đó bằng 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.