2012-01-12 6 views
70

私はUILabelのテキストをサーバーから取得しています。テキストの一部はリンクとして識別され、これらのリンクに触れると何らかのアクションが実行されます。例えばUILabel - テキストとリンクとしての文字列

NSString * str = @ "私の電話番号は645-345-2345で、私のアドレスはxyz"です。

これはUILabelの完全なテキストです。私はこのテキストを表示するために1つだけUILabelを持っています(テキストは動的です。私は例を挙げました)。これらのリンクをクリックすると、別の画面に移動したり、電話をかけるなどの操作を実行する必要があります。
私はOHAttributedLabelの助けを借りてそのようなテキストを表示できることを知っています。そして、次のようにリンクが表示されることができます。

[label1 addCustomLink:[NSURL URLWithString:@"http://www.foodreporter.net"] inRange:[txt rangeOfString:someString]]; 

をしかし、私はこれらのテキストはが別の画面にナビゲーションのようないくつかのアクションを実行したり、電話をかけるにリンクすることができますか疑問。
詳しい説明が必要な場合は教えてください。

+1

2013年以降... UITextViewを使用してinterfaceBuilderの「リンクを検出」をクリックするだけで簡単です。 – Fattie

+0

http://stackoverflow.com/questions/10116820/how-to-make-customlink-touchable-in-ohattributedlabel – kernix

+0

[UILabelのNSAttributedTextのタップ可能なリンクを作成する](http: /image/gif/paws/211687/create-tapable-link-in-the-nsattributedtext-of-a-uilabel) – NAlexN

答えて

129

あなたは後で傍受ますURLスキームを使用してリンクをサポート可能なUILabel置換のいずれかにカスタムアクションを追加することができます

- (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をご覧ください。それは、カスタムリンクをすぐにサポートします。

+4

これを追加するには、カスタムURLに 'action:// show-help'などの'/'が必要です。それ以外の場合、スキームは唯一の有効なurlプロパティになります。 (他はすべて二重スラッシュなしでゼロになります)。 – Dima

+1

Thanksssssssss !!! :) SO MUCH – KarenAnne

+0

ありがとう、私はラベルを付け、特別な範囲にリンクを挿入しました。しかし、私はフォントサイズを変更することができません。助けてください。 –

3
カスタムラベルにジェスチャーを追加することができます..Alsoボタンを使用したくない場合は、リンクのような外観を与えるためにカスタムボタンを使用することができます

..

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]; 
+0

私は単一のラベルのみを使用する必要があります。私はそこにボタンを置くことはできません。 – Nitish

+0

2番目のオプションについて説明してください。ここで役に立つかもしれません。 – Nitish

+0

リンクはラベルの異なる位置にあります。位置は動的です。このアプローチはどのように私のために働くことができますか? – Nitish

6

FancyLabelと呼ばれるプロジェクトがありますあなたが必要とするものについてそれはしかし、いくつかのカスタマイズが必要かもしれません。 また、私はThree20にこの機能がありますが、まだ使用していないのであれば余計かもしれません。

すべてのリンクがphones \ addresses \ urlsの場合は、はるかに簡単な解決法もあります。あなたは単にUILabelの代わりにUITextViewを使うことができます。 here

があります説明したようにそれは、などの携帯電話の自動検出、アドレス、(ちょうどIBでチェックボックスをオン)

あなたは、OpenURLのをオーバーライドすることで、これらのリンクのクリックイベントに応じてカスタムアクションをも持つことができましたUITextViewの代わりにUILabelを使用する必要がある特定の理由はありますか? 属性付きラベルの実装の多くは、UIViewから継承しているか、UILabelのすべての機能を実装していないことに注意してください。

9

私のプロジェクトはこれにOHAttributedLabelをうまく使っています。 OHAttributedLabelDelegatelink)で

-(BOOL)attributedLabel:(OHAttributedLabel*)attributedLabel shouldFollowLink:(NSTextCheckingResult*)linkInfo;

方法をチェックしてください。リンクをクリックすると何が起きるかを決めることができます。 the example from the OHAttributedLabel projectのソースを見ると、警告が表示されます。この場合、NOが返された場合(既定のアクションを維持するために)、ナビゲーションなどの必要な操作を行うことができます。

ただし、これはテキストから正しく動作を判断する必要があります。私たちのプロジェクトでは、サーバーがタグを含むテキストをサーバーに送信し、各タグに対して実行するコマンドのリストを使用するやや洗練されたソリューションを使用しました。あなたのTTTAttributedLabelDelegateで、

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

その後:

18

UITextViewを電話番号とリンクの検出で使用すると、スクロールが無効になります。はいユーザーインタラクションが有効になります。UILabelの代わりにYESを使用します。

+0

2013年以降。これは簡単です。 – Fattie

+1

@Ganesh、なぜスクロールが無効になっていますか? – brainjam

2

私は私が必要とするすべてのリンクをレンダリングする軽量ラベルであるときUITextViewまたはサードパーティのlibを使用することを余儀なくされたのファンではない(と彼らがタップしているときには、私に語った!)

ここに私ですリンクタップを検出できる軽量のUILabelサブクラスを試してください。このアプローチは、UILabelの共有NSLayoutManagerへのアクセス権が、カテゴリ拡張を介してNSTextStorageに代理コールバックを介して追加されている点とは異なります。その美しさは、UILabelがそのネイティブレイアウトと描画を実行することです。UILabelは、多くの場合、ネイティブの動作を追加するか、またはNSLayoutManager/NSTextContainerで置き換えます。

おそらくApp Storeは安全ですが、やや壊れやすい - 自己責任で使用してください!

https://github.com/TomSwift/TSLabel

+0

自動検出機能はありません。 –

0

新しい依存関係をもたらすしたくない場合 - リンクを表示し、彼らのためにカスタムアクションを実行するための標準的なUILabelを設定することが可能です。チェックアウトthis私のStackOverflow答え。

関連する問題