如何在UITextView中的特定单词之上创建隐形uibutton?

时间:2012-04-30 16:24:47

标签: ios cocoa-touch uibutton uitextview hyperlink

我对可可的触摸还很新,跟我一样。

我正在尝试设计一个向用户显示一些说明的应用。我正在通过UITextView显示这些说明,现在我正在尝试添加一个功能,用户可以在其中单击特定单词并在另一个视图中查看其定义。

具体的单词都将来自sqlite数据库。 所以我的问题是:实现这一目标的最佳方法是什么?

我在考虑将不可见的UIButton叠加在单词之上,但我不知道如何将它们放在UITextView中的单词之上。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

实现所需内容的最简单方法是使用UIWebView而不是UITextView。您可以将指令文本转换为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设置文本样式。

答案 1 :(得分: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