2011-08-13 5 views
2

텍스트를 명중하는 방법이 있습니까? 내가 텍스트 그리는 경우 즉, 예를 들면 "화면에, 경계 상자 내에서, 나는이 빈 사각형의 크기와 위치 (공백) 말할 수있는 방법"안녕하세요 그래프! ": 위의Cocoa (Mac)에서 히트 테스트 텍스트?

  • 공백 사각형을 "E"문자
  • "O"문자 위에서 걸쳐 빈 사각형 상기 문자 "P"
  • 까지
  • "g"전 공간까지의 문자 "H"아래 빈 사각형

등을 사용하면 아이디어를 얻을 수 있습니다.

즉, 실제 텍스트가 차지하는 영역과 실제로 비어있는 영역을 찾는 방법.

플랫폼 (그래픽 라이브러리)은 Mac OS X의 Cocoa이고, 문자 세트는 유니 코드 (원시 CoreGraphics API를 제외시킬 수 있습니까?)이며, 글꼴은 Cocoa에서 사용할 수있는 모든 것일 수 있습니다. 당신이 원하는 그 NSGlyph를 얻을, 그리고

//Get the range of characters, which may be different than the range of glyphs 
NSRange range = [[textView layoutManager]glyphRangeForCharacterRange:NSMakeRange(charIndex, 0) actualCharacterRange:NULL] 

//Get the rect of the character 
NSRect rect = [[textView layoutManager]boundingRectForGlyphRange:range inTextContainer:[textView textContainer]]; 

을 : 사전

+0

또는 다른 관점에서 보면 텍스트를 최소한으로 둘러싸는 영역 (직사각형) 목록을 가져 오는 것입니다. – adib

답변

1

에서

덕분에이 같은 NSTextView에서 문자의 RECT를 얻을 수

NSGlyph glyph = [[textView layoutManager]glyphAtIndex:range.location]; 

을 그립니다 그것 안에있는 NSBezierPath :

NSBezierPath *path = [NSBezierPath bezierPath]; 
[path appendBezierPathWithGlyph:glyph inFont:myFavoriteFont]; 
,

다음, 그 경계의 경로를 조회 :

NSRect actualRect = [path bounds]; 

그런 다음 두 사각형을 비교할 수 있습니다.

NSLayoutManager Class Reference, Text System OverviewText Layout Programming Guide을 살펴보십시오.

+0

이것은 텍스트보기에서만 솔루션을 제한합니다. 아니면 퇴보의 경우에는 히트 - 테스트 할 모든 텍스트 부분에 대해 보이지 않는 텍스트보기를 만드십시오 (대용량의 텍스트를 처리 할 때 확장되지 않을 수도 있음). – adib

+0

첫 번째 단계를 수행하고 'NSBezierPath'에서 글리프 그리기를 시도해 볼 수 있습니다. – spudwaffle

1

완전 투명 비트 맵 위에 텍스트를 그릴 수 있습니다 (CGBitmapContext 경유). 그런 다음 특정 포인트가 투명한지 확인하십시오.

당신이 (즉,이 2D 그래픽에서 지역라고합니다) 직사각형의 목록을해야하는 경우가있는 CoreGraphics로, 그 자신을 구현하거나 도서관에 대한 구글해야하고 코코아 적어도 문서화 (지역이 없습니다).

관련 문제