UITextViewで自動検出されたリンクの色を変更できますか?


115

私が持っていたUITextView電話番号とリンクを検出しているが、これは私が上書きされますfontColorし、それを変更しますblueColor。自動検出されたリンクの色をフォーマットする方法はありますか、またはこの関数の手動バージョンを試す必要がありますか?


private-apiサブビューUIWebDocumentViewを使用してこの回答を確認してください: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では、NSFontAttributeNamewith をオーバーライドできませんでした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 2013年

私は知っています...しかし、ハックが少ない回避策はわかりません。Appleはこれらの細部について本当に考えるべきです。
Leandro Alves 2013年

@オスカー、まあ、それはアレクサンダースの答えよりもハックが少ないと思います。そのような基本的な機能には単純なプロパティがないことにまだ夢中です。
アンディ

1
質問はwebviewではなくtextviewについてです!
ボリス・ガフロフ2013年

「asdasd」に完全に同意します。Webアプローチは非常に高価です。RAMの使用量を確認するために彼らはそうしています。このような単純なタスクには、Appleが提供するtextviewとプロパティを使用します。
ingconti 2017年

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 16

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

文字列は「iOSを学びたいですか」です。無料のiOSチュートリアルの最高のソースをご覧ください。hello google.comの迅速なチェックAttributed 9826012345文字列テスト中... "とWebリンクと携帯電話番号にはデフォルトのリンク属性が必要ですが、文字列部分" iOSを学びたいですか? "のリンクを別の色で作成したい[:]が唯一のカスタムリンクのために働いているlink..So self.tv.linkTextAttributes =と
BalKrishan Yadavが

14

次の方法で、TextViewのハイパーリンクの色を変更できます。

Nibファイルでは、プロパティウィンドウに移動して、色合いを好きな色に変更できます。

または、以下のコードを使用してプログラムで行うこともできます

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];


3

私は確かにwebviewを使用せずに別の方法を見つけましたが、これはプライベートAPIを使用しており、appstoreで拒否される可能性があることに注意してください:

編集:私のアプリはアップルによって承認されましたが、プライベート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はdiv経由のようにWebiviewでレンダリングされるため、さらに進んで各リンクタイプに個別に色を付けることもできます。

<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

EDIT: DOはでそれをしないで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;
}

次のように、htmlページに「headercopy」クラスを使用します。

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

これにより、クリック機能で必要な色で電話番号が表示されます。


Webビューの使用は、ネイティブアプリの悪いプログラミングスタイルです。
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.