我对可可的触摸还很新,跟我一样。
我正在尝试设计一个向用户显示一些说明的应用。我正在通过UITextView显示这些说明,现在我正在尝试添加一个功能,用户可以在其中单击特定单词并在另一个视图中查看其定义。
具体的单词都将来自sqlite数据库。 所以我的问题是:实现这一目标的最佳方法是什么?
我在考虑将不可见的UIButton叠加在单词之上,但我不知道如何将它们放在UITextView中的单词之上。
感谢您的帮助!
答案 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