我對可可觸摸仍然很陌生,所以對我一無所知。如何在UITextView中的特定單詞的頂部創建隱形的uibuttons?
我試圖設計一個應用程序,向用戶顯示一些說明。我通過UITextView顯示這些說明,現在我試圖添加一個功能,用戶可以在其中單擊特定單詞並在另一個視圖中查看它的定義。
具體的話都將來自一個SQLite數據庫。 所以我的問題是:什麼是最好的方式來實現這一目標?
我想覆蓋單詞上方的無形UIButtons,但我不知道如何將它們放在UITextView內的單詞上。
感謝您的幫助!
我對可可觸摸仍然很陌生,所以對我一無所知。如何在UITextView中的特定單詞的頂部創建隱形的uibuttons?
我試圖設計一個應用程序,向用戶顯示一些說明。我通過UITextView顯示這些說明,現在我試圖添加一個功能,用戶可以在其中單擊特定單詞並在另一個視圖中查看它的定義。
具體的話都將來自一個SQLite數據庫。 所以我的問題是:什麼是最好的方式來實現這一目標?
我想覆蓋單詞上方的無形UIButtons,但我不知道如何將它們放在UITextView內的單詞上。
感謝您的幫助!
最簡單的方式來實現,你需要將使用的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鏈接他們自己的方案(「定義://」),使截取更容易一些,更可靠。 (你以後可以在你的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對文本進行樣式設置。
我不知道這是最好的辦法,但我會回答這個問題,你問過它:
// 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子類,自己執行自定義繪圖(這也將實現跟蹤單詞位置的邏輯),然後實現觸摸事件處理,根據你的單詞位置列表交叉檢查觸摸的位置。我不確定哪個更好,但是如果你正在討論添加大量的UIButtons,你可能會遇到相對較快的性能問題。
爲了處理自定義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
我實際上並不知道如何確定UITextView中特定單詞的框架/邊界......但是一旦我認爲我們的解決方案會幫助我解決很多問題!儘管如此,謝謝! – ad0ran
對我的問題來說,這實際上是相當優雅的解決方案!我想我會朝這個方向前進,因爲在UITextView中查找特定單詞的框架/邊界似乎要少得多。謝謝! – ad0ran