[解決済み] iOSのUITextViewで属性付きテキストへのタップを検出する
2022-07-07 04:39:53
質問
私は
UITextView
を表示し
NSAttributedString
. この文字列には、タップできるようにしたい単語が含まれていて、タップされると呼び出されてアクションを実行できるようになります。私は、次のように理解しました。
UITextView
は URL のタップを検出し、私のデリゲートをコールバックすることができますが、これらは URL ではありません。
iOS 7 と TextKit のパワーで、これは可能になるはずですが、例を見つけることができず、何から始めればよいのかわかりません。
文字列にカスタム属性を作成できるようになったということですが (まだやっていませんが)、おそらくこれがマジックワードの 1 つがタップされたかどうかを検出するのに役に立つのではないでしょうか。いずれにせよ、タップを遮断し、どの単語でタップが発生したかを検出する方法はまだわかっていません。
iOS 6 との互換性に注意してください。 ではない は必須ではありません。
どのように解決するのですか?
私はちょうどもう少し他の人を助けたいと思いました。Shmidt の回答に従って、私が最初の質問で尋ねたとおりのことを行うことが可能です。
1) クリック可能な単語にカスタム属性を適用した属性付き文字列を作成します。
NSAttributedString* attributedString = [[NSAttributedString alloc] initWithString:@"a clickable word" attributes:@{ @"myCustomTag" : @(YES) }];
[paragraph appendAttributedString:attributedString];
2) その文字列を表示するUITextViewを作成し、そこにUITapGestureRecognizerを追加します。そして、タップを処理します。
- (void)textTapped:(UITapGestureRecognizer *)recognizer
{
UITextView *textView = (UITextView *)recognizer.view;
// Location of the tap in text-container coordinates
NSLayoutManager *layoutManager = textView.layoutManager;
CGPoint location = [recognizer locationInView:textView];
location.x -= textView.textContainerInset.left;
location.y -= textView.textContainerInset.top;
// Find the character that's been tapped on
NSUInteger characterIndex;
characterIndex = [layoutManager characterIndexForPoint:location
inTextContainer:textView.textContainer
fractionOfDistanceBetweenInsertionPoints:NULL];
if (characterIndex < textView.textStorage.length) {
NSRange range;
id value = [textView.attributedText attribute:@"myCustomTag" atIndex:characterIndex effectiveRange:&range];
// Handle as required...
NSLog(@"%@, %d, %d", value, range.location, range.length);
}
}
やり方がわかれば簡単!
関連
-
[解決済み] UILabel 内のテキストを縦に上部に揃える
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] iOSのステータスバーの文字色を変更する方法
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] UITextViewのプレースホルダー
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] UITextViewのサイズをコンテンツに合わせるには?
-
[解決済み] UITextViewのマージン/パディングをなくす方法
-
[解決済み] ファイルはユニバーサル(3スライス)ですが、iOSの静的ライブラリのための(n)ARMv7-sスライスエラーが含まれていない、どうにかして回避するには?
-
[解決済み】SwiftでUITextView内にプレースホルダーテキストを追加しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
EXC_BAD_ACCESS (code=2, address=0x0)
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み] iOS - UITextFieldの外側をタッチするとキーボードが外れる。
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] NSNotificationCenterのaddObserver in Swift
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する
-
[解決済み] iOSアプリをApple Developer Programや脱獄せずにデバイス上でテストすることができます。
-
[解決済み】NSAttributedStringでクリック可能なリンクを作成するにはどうすればよいですか?
-
[解決済み] SwiftでUITextFieldとUITextViewのカーソル位置の取得と設定