2012-04-30 42 views
1

我對可可觸摸仍然很陌生,所以對我一無所知。如何在UITextView中的特定單詞的頂部創建隱形的uibuttons?

我試圖設計一個應用程序,向用戶顯示一些說明。我通過UITextView顯示這些說明,現在我試圖添加一個功能,用戶可以在其中單擊特定單詞並在另一個視圖中查看它的定義。

具體的話都將來自一個SQLite數據庫。 所以我的問題是:什麼是最好的方式來實現這一目標?

我想覆蓋單詞上方的無形UIButtons,但我不知道如何將它們放在UITextView內的單詞上。

感謝您的幫助!

回答

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鏈接他們自己的方案(「定義://」),使截取更容易一些,更可靠。 (你以後可以在你的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

對我的問題來說,這實際上是相當優雅的解決方案!我想我會朝這個方向前進,因爲在UITextView中查找特定單詞的框架/邊界似乎要少得多。謝謝! – ad0ran

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子類,自己執行自定義繪圖(這也將實現跟蹤單詞位置的邏輯),然後實現觸摸事件處理,根據你的單詞位置列表交叉檢查觸摸的位置。我不確定哪個更好,但是如果你正在討論添加大量的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 
+0

我實際上並不知道如何確定UITextView中特定單詞的框架/邊界......但是一旦我認爲我們的解決方案會幫助我解決很多問題!儘管如此,謝謝! – ad0ran

相關問題