2012-04-30 2 views
1

나는 아직도 코코아 터치에 너무 익숙해 져있어.UITextView의 특정 단어 위에 보이지 않는 uibuttons를 만드는 방법은 무엇입니까?

사용자에게 몇 가지 지침을 표시하는 앱을 디자인하려고합니다. UITextView를 통해 이러한 지시 사항을 표시하고 있으며 사용자가 특정 단어를 클릭하여 다른 단어보기의 정의를 볼 수있는 기능을 추가하려고합니다.

특정 단어는 모두 sqlite 데이터베이스에서 제공됩니다. 내 질문은 : 이것을 달성하는 가장 좋은 방법은 무엇입니까?

단어 위에 보이지 않는 UIButtons를 겹쳐서 생각하고 있었지만 UITextView 내부에 단어를 배치하는 방법을 모르겠습니다.

감사합니다.

// 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]; 

이제 다른 제안을 위해, 당신이 할 수 있습니다 : 당신이 그것을 요청했습니다으로

답변

2

가장 쉬운 방법은 대신 UITextView의있는 UIWebView를 사용하는 것이 필요 달성하기 위해. 당신이 태그에 클릭 할 수있는 키워드를 넣었을 때

<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로 HTML 텍스트를로드

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

다음과 같은 방법은 매번 호출되는있는 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

나는 이것이 가장 좋은 방법입니다 모르겠어요,하지만 난 질문에 답변 해 드리겠습니다 자신의 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 
+0

실제로 프레임/UITextView 내부 특정 단어의 경계를 결정하는 방법을 모르겠지만 ... 일단 내가 우리의 그림, 일단 귀하의 솔루션을 많이 도와 줄 것입니다! 그럼에도 불구하고 고맙습니다! – ad0ran

관련 문제