1

ユーザーにいくつかの指示を表示するアプリを設計しようとしています。UITextView を介してこれらの指示を表示していますが、現在、ユーザーが特定の単語をクリックしてその定義を別のビューで表示できる機能を追加しようとしています。

特定の単語はすべて sqlite データベースから取得されます。私の質問は次のとおりです。これを達成するための最良の方法は何ですか?

非表示の UIButton を単語の上に重ねることを考えていましたが、UITextView 内の単語の上に配置する方法がわかりません。

4

2 に答える 2

2

必要なものを実現する最も簡単な方法は、UITextView の代わりに UIWebView を使用することです。指示テキストを次のような HTML ファイルに変換します。

<html>
   <head></head>
   <body>
      <div>This is a dummy text with a <a href="definition://id1234">clickable keyword</a> inside the text</div>
   </body>
</html>

クリック可能なキーワードをタグに入れると、クリック可能になり、UIWebView のデリゲート メソッドでこのクリックをインターセプトできます。

HTML テキストを UIWebView にロードします。

UIWebView *webView = [[UIWebView alloc] init];
webView.delegate = self;
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://yourdomain.com/text.html"]]];

WebView にデリゲートを割り当てると (上記のコード スニペットのように)、UIWebView がリクエストを行うたびに次のメソッドが呼び出されます。ここで、キーワードのクリックを傍受できます。キーワード HTML リンクに独自のスキーム (「definition://」) を付けて、インターセプトを少し簡単にし、信頼性を高めました。(後で HTML に他のリンクを含めることができます。)

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
   if ([[request.URL scheme] isEqualToString:@"definition"]) {
      NSString *definitionWordID = [request.URL host];
      NSLog(@"show definition for word with ID: %@", definitionWordID);
      return NO;
   }
   return YES;
}

これが、あなたが達成したいことを実装する方法です。HTML を使用すると、キーワードに HTML リンクを使用しているため、テキスト内のキーワードの位置を気にする必要がないという大きな利点があります。それに加えて、HTML を使用すると、CSS を介してテキストのスタイルを設定できます。

于 2012-04-30T21:19:58.917 に答える
0

これが最善のアプローチかどうかはわかりませんが、あなたが尋ねたように質問に答えます。

// This assumes you have already determined the frame for the button
// i.e., you know the origin and size of the word in the UITextView
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setBackgroundColor:[UIColor clearColor]];
[btn setFrame:wordFrame];
[textView addSubview:btn];
// Now, you need to also figure out how to handle the user pressing the button
[btn addTarget:self action:@selector(wordButtonWasPressed:) forControlEvents:UIControlEventTouchUpInside];

ここで、別の提案として、独自の UIView サブクラスを作成し、カスタム描画を自分で実行して (単語の位置を追跡するためのロジックも実装します)、タッチ イベント処理を実装して、タッチの位置をクロスチェックすることをお勧めします。単語の場所のリスト。どちらが優れているかはわかりませんが、大量の UIButton を追加することについて話している場合は、パフォーマンスの問題が比較的早く発生する可能性があります。

カスタム UIView サブクラスでタッチ イベントを処理するには、次のメソッドを調べます。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
于 2012-04-30T16:44:43.640 に答える