2012-01-10 4 views
5

내가하고 싶은 것은 가장 가까운 단어가 무엇인지 나타낼 수있는 텍스트 컨테이너 구성 요소를 만드는 것입니다 (예 : 단어 "behind" "라고 부름).UILabel/UITextView에서 단어를 가져 오는 방법

먼저 UILabel 서브 클래스를 만들고 touchesEnded : withEvent : 메소드를 오버라이드하여 터치 된 CGPoint를 결정합니다. 또한 sizeWithFont : forWidth : lineBreakMode :를 사용하여 텍스트의 각 단어에 해당하는 "프레임"(CGRect)을 계산하는 메서드를 작성했습니다. 터치 된 CGPoint와이 프레임을 사용하여 실제로 어떤 단어가 터치되었는지 확인할 수 있습니다. 그러나 프레임을 계산하는 방법은 단선 텍스트로만 작동합니다.

이제 텍스트의 어느 부분이 주어진 줄에 있는지 (즉, 텍스트가 어떻게 분할되었는지) 알아야 각 단어의 올바른 왼쪽 여백과 위쪽 여백을 파악할 수 있습니다.

어떻게 얻을 수 있습니까? 또는이를 달성하기위한 좀 더 간단한 해결책이 있습니까? This post was unfortunately not very helpful... ...

답변

9

(가 유용한 샘플 코드를 포함 않는 링크 된 게시물에 샘플 코드 프로젝트에 링크입니다,하지만 난 당신이 여기에 대한 과정도 개설 할 것이다.) 한마디로

, 당신을 iOS 및 OS X의 모든 정교한 텍스트 레이아웃을 뒷받침하는 Apple의 고급 C 기반 텍스트 처리 프레임 워크 인 Core Text를 사용해야 할 것입니다.

전체 코드는 다소 복잡하지만 핵심 방법은 다음과 같습니다. 봐야 할 것입니다 :

CTFramesetterCreateWithAttributedString() - conj에서 사용하십시오. 레이블의 텍스트에서 얻을 NSAttributedString과의 결합 - 프레임 세터 만들기

CTFramesetterCreateFrame() - 위의 프레임 세터에서 텍스트의 CTFrameRef를 가져 오는 데 사용합니다. 이렇게하려면 라벨 범위를 사용하여 CGPathRef를 만들어야합니다.

CTFrameGetLines(), CTFrameGetLineOrigins() - typeset 라인과 라인 원점의 좌표에 각각 해당하는 CTLineRef를 가져온 다음 CTLineGetStringIndexForPosition()을 사용하여 터치 위치에서 문자 인덱스를 찾습니다.

그런 다음이 문자 색인을 사용하여 줄의 참조 프레임에서 전체 문자 열에서 실제 문자/단어/등을 찾을 수 있습니다.

는 문제가 몇 가지 문제로 복잡 잊지 마세요 :

  1. 당신이 사용하는 경우

    UILabel의의 당신은 완벽의 대부분 때문에 번거로울 수 있습니다 조판 통계와 일치하는데주의를 기울여야 할 것이다 그리기 기본 객체 (예 : CTFontRef)는 UIKit 대응 물과 무료로 연결되지 않습니다. 자신의 그림을 구현하는 것이 때로는 더 쉬울 수도 있으며, 이는 메트릭 일치를 보장합니다.

  2. 코어 텍스트는 일반적인 iOS 제도 시스템에 대해 역 좌표 시스템을 사용합니다. 엉뚱한 결과를 얻고 특히 자신의 그림을 그리는 경우 특히이 점을 고려해야합니다.

세계에서 가장 쉬운 작업은 아니지만 불가능한 것은 아닙니다. 행운을 빕니다!

+0

실제로 텍스트를 직접 그리는 것은 초기 필요성을 고려할 때 약간의 오버 헤드가되는 것처럼 보이므로 피하고 싶습니다. 내가 준 CoreText 키 - 기능을 고려할 것입니다, 감사합니다! – AgentCorleone

2

비록 이것이 오래된 질문이지만, 이것은 약간의 도움이 될 수 있다고 생각합니다.핵심 텍스트를 학습 거대한 이었기 때문에

, 난 몇 가지 변경으로 GLTapDemo by German Laullon

를 들어,이 UILabel의에 감동 단어를 검출 위대한 작품을 선택했다.

+1

VSWordDetector 솔루션과이 솔루션을 모두 시도한 결과,이 제품이 사용 사례에서보다 효과적으로 작동한다는 것을 알았습니다. –

5

비트를 검색 한 후에 이에 대한 코드를 작성했습니다. 코드는 UITextViewUILabel에서 작동합니다.
VSWordDetector.zip을 다운로드 한 다음 &을 폴더 VSWordDetector으로 드래그하여 프로젝트에 놓습니다.
ViewController 클래스에는 VSWordDetector.hVSWordDetector.m
#import VSWordDetector.h 개의 파일 두 개가 있습니다.

@property (strong, nonatomic) VSWordDetector *wordDetector; 

참고 : 같은 로컬로하지 않는 그것의 속성을 확인합니다.

이제 당신에 대한 준비, 그냥 당신이 연결된 레이블 또는 텍스트 뷰에 탭 때 호출됩니다 textViews 또는 Labels

-(void)viewDidLoad 
{ 
    self.wordDetector = [[VSWordDetector alloc] initWithDelegate:self]; 
    [self.wordDetector addOnView:textView]; 
    [self.wordDetector addOnView:label]; 
} 

-(void)wordDetector:(VSWordDetector *)wordDetector detectWord:(NSString *)word 
{ 
    NSLog(@"Detected Word: %@", word); 
} 

이 위임 방식에 추가합니다.

편집 : 에 대한 VSWordDetector.

SUGGESTED 편집 : 예제 코드를 다운로드하지 않으려면 두 파일의 코드를 참조하십시오. 이 요점 파일 VSWordDetector을 참조하십시오.

+0

안녕하세요. 코드를 사용하려고했지만 탭이 감지되지 않았습니다. 내가 준 발걸음을 따라 갔다. 어디가 잘못 됐는지 말해 줄 수 있니? –

+1

@NijilNair 죄송하지만 어디서 잘못하고 있는지 말할 수는 없습니다. 그래서 샘플을 만들었습니다. 내 대답의 일부 편집을 참조하십시오. – TheTiger

+0

나는 압축 된 코드의 큰 재미가 아니다. 여기에'VSWordDetector'의 관련 부분을 추가하거나 github에 코드를 붙여 넣으십시오. – Sulthan

관련 문제