Twitter などのリモート Web サービスからメッセージを受信する楽しみのためのアプリに取り組んでいます。これらのメッセージには URL:s が含まれている場合があり、これらをクリックできるようにしたいと考えています。どのアプローチが最適なのだろうか。NSLinkAttributeName を試しましたが、iOS では機能しません。透明なボタンを作成して、テキストビューの適切な場所の上に配置することは可能ですか? どうすればそれができますか?または、より良い/より簡単な方法はありますか? URL の位置と長さはさまざまです。
3 に答える
これには 2 つの良い方法があります。
1. CoreText、または TTTAtributedLabel のようなそれのラッパー
それが最も強力なソリューションです。Datadetectortypes をサポートしており (ただし、パフォーマンスを表示する前に独自の検出を行ったほうがよいでしょう)、比較的人気があります。
ただし、使用状況によっては、テーブルビューのスクロール パフォーマンスに影響を与える可能性があります。
2. IFTweetLabelのようにラベルの上にボタンを動的に配置する
それは簡単な解決策です。IFTweetLabel は基本的に UILabel のドロップインであり、そのままで非常に優れたパフォーマンスを発揮します。ただし、カスタマイズしすぎると、最終的には限界に達します。100% 常に完全に動作するわけではないことは言うまでもありません。YMMV。
1 つのオプションは、 を使用することUIDataDetectorTypeLink
です。詳細については、このリンクを確認してください。
// Create textview, centering horizontally
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 10, 320, 50)];
// Set font, background and alignment
[textView setFont:[UIFont boldSystemFontOfSize:16]];
[textView setBackgroundColor:[UIColor blackColor]];
[textView setTextAlignment:UITextAlignmentCenter];
// Unfortunately the link will show as blue even with this setting
// [textView setTextColor:[UIColor greenColor]];
// Edit and scrolling off
[textView setEditable:NO];
[textView setScrollEnabled:NO];
// Set data type to specify URL/link
[textView setDataDetectorTypes:UIDataDetectorTypeLink];
// Set text as URL
[textView setText:@"text.com"];
[self.view addSubview:textView];
他のいくつかのオプションは 、その中のUIWebview
URL のタッチを処理するデリゲートを使用しています。もう1つのオプションは派手なUILabelsです
あなたが尋ねた他の質問については、このHow to open a UITextView URL in UI Web View? を確認してください。、 カスタム UIDataDetectorTypes を作成する方法はありますか? フィルタを使用してUITextViewリンクの色を変更しますか?
NSLinkAttributeName
は でタップ可能ですがUITextView
、 ではタップできませんUILabel
。iOS 7+ 用であり、UITextView が(ストーリーボード内に) ある必要があることに注意してくださいSelectable
。
迅速なデモンストレーション:
let attributedText = NSMutableAttributedString(string: "Hello world")
attributedText.addAttribute(.link, value: URL(string: "https://example.com")!, range: NSRange(location: 0, length: attributedText.length))
textView.attributedText = attributedText