サーバーからテキストを取得しているUILabel
があります。一部のテキストはリンクとして識別され、それらのリンクに触れると、何らかのアクションが実行される必要があります。例えば.
NSString * str = @ "私の電話番号は 645-345-2345 で、私のアドレスは xyz ";
これは、UILabel
の完全なテキストです。このテキストを表示するためのUILabel
は1つだけです(テキストは動的です。例を挙げただけです)。これらのリンクをクリックすると、別の画面に移動したり、電話をかけるなどのアクションを実行する必要があります。
OHAttributedLabelを使用してこのようなテキストを表示できることを知っています。また、リンクは次のように表示できます。
[label1 addCustomLink:[NSURL URLWithString:@"http://www.foodreporter.net"] inRange:[txt rangeOfString:someString]];
しかし、これらのテキストリンクを使用して、別の画面へのナビゲーションや呼び出しなどのアクションを実行するにはどうすればよいでしょうか。
詳細な説明が必要かどうかを教えてください。
fakeURLスキームを使用して、リンクをサポートする使用可能なUILabel
置換のいずれかにカスタムアクションを追加できます。後で傍受すること:
TTTAttributedLabel *tttLabel = <# create the label here #>;
NSString *labelText = @"Lost? Learn more.";
tttLabel.text = labelText;
NSRange r = [labelText rangeOfString:@"Learn more"];
[tttLabel addLinkToURL:[NSURL URLWithString:@"action://show-help"] withRange:r];
次に、TTTAttributedLabelDelegate
で:
- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url {
if ([[url scheme] hasPrefix:@"action"]) {
if ([[url Host] hasPrefix:@"show-help"]) {
/* load help screen */
} else if ([[url Host] hasPrefix:@"show-settings"]) {
/* load settings screen */
}
} else {
/* deal with http links here */
}
}
TTTAttributedLabel はOHAttributedLabelのフォークです。
より複雑なアプローチが必要な場合は、 Nimbus Attributed Label をご覧ください。すぐに使用できるカスタムリンクをサポートします。
UILabelの代わりに、UITextViewを電話番号とリンクの検出で使用し、スクロールを無効にし、ユーザー対話を有効にします。
私のプロジェクトでは、このためにOHAttributedLabelを使用しています。をチェックしてください
-(BOOL)attributedLabel:(OHAttributedLabel*)attributedLabel shouldFollowLink:(NSTextCheckingResult*)linkInfo;
OHAttributedLabelDelegate
のメソッド( link )。リンクがクリックされたときに何が起こるかを決定できます。 OHAttributedLabelプロジェクトの例 のソースを見ると、アラートの表示に使用されます。この場合にNO
を返した場合(デフォルトのアクションが発生しないようにするため)、ナビゲーションなどのように何でもできます。
ただし、これには、テキストだけでアクションを正しく判断できることが必要です。このプロジェクトでは、サーバーがタグと各タグに対して実行するコマンドのリストを含むテキストをサーバーから送信する、少し手の込んだソリューションを使用しました。
FancyLabel というプロジェクトがあり、それはあなたが必要としているものです。ただし、カスタマイズが必要な場合があります。また、 Three2 にはこの機能があると思いますが、まだ使用していない場合はやり過ぎかもしれません。
すべてのリンクが電話\アドレス\ URLである場合は、はるかに簡単なソリューションもあります。 UILabelの代わりにUITextViewを使用するだけです。電話、住所などの自動検出があります(IBのボックスをチェックするだけです)
here のように、openURLをオーバーライドすることにより、これらのリンクのクリックイベントに応答してカスタムアクションを設定することもできます。
UITextViewの代わりにUILabelを使用する必要がある特定の理由はありますか?属性付きラベルの実装の多くは、UIViewを継承するか、UILabelのすべての機能を実装しないことに注意してください。
私が必要とするのは、リンクをレンダリングする軽量ラベルだけで、UITextView
やサードパーティのライブラリを使用することを強制されるのは好きではありません(リンクがタップされたときに通知します!)
リンクタップを検出できる軽量のUILabel
サブクラスでの私の試みです。このアプローチは、カテゴリ拡張を介してUILabel
に追加されたデリゲートコールバックを介してNSLayoutManager
の共有NSTextStorage
にアクセスするという点で、他のアプローチとは異なります。美しさは、UILabel
がネイティブのレイアウトと描画を実行することです。他のUILabel
の置換は、多くの場合、ネイティブの動作を追加のNSLayoutManager
/NSTextContainer
で補強または置換します。
おそらくApp Storeは安全ですが、多少脆弱です-ご自身の責任で使用してください!
リンクのように見えるカスタムボタンを使用できます。また、ボタンを使用したくない場合は、カスタムラベルにジェスチャーを追加できます。
UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTappedOnLink:)];
// if labelView is not set userInteractionEnabled, you must do so
[labelView setUserInteractionEnabled:YES];
[labelView addGestureRecognizer:gesture];