2012-03-26 2 views
2

(잠재적으로 거대한) 구성 요소에 대해 효율적인 히트 테스트를 수행해야하므로 내 모든 프리미티브를 NSBezierPath 인스턴스로 나타 냈습니다. 지금까지 모든 일은 훌륭합니다. 내가 베 지어 경로로 문자열을 변환하는 애플의 SpeedometerView 예에서 NSString (BezierConversions) 범주를 사용하고 있습니다 :NSString 드로잉 대 NSBezierPath 드로잉 문자열

는 지금은 특히 뷰에서의 위치를 ​​반영, NSString 객체를 변환하는 데 문제가 있습니다. 문자열을 생성

베 지어 경로는 내가이 질문은 정말 약

  • NSBezierPathtransformUsingAffineTransform: 대 겠지 그래서 꽤 작업을 수행하는보기에서 NSString 인스턴스 위치의 위치에 맞게 큰하지만의 위치를 ​​찾습니다 .
  • NSAffineTransform의 조합 심지어 사소한 경우는 실패 내 테스트 프로젝트에서

을 뷰에 적용 NSString drawAtPoint: :

Purple = NSString drawAtPoint, Grey = NSBezierPath fill

회색 베 지어 사용하여 그려 문자열의 표현 :

NSAffineTransform *moveFinal = [NSAffineTransform transform]; 
[moveFinal translateXBy:x yBy:y]; 
[textBezier transformUsingAffineTransform:moveFinal]; 

[testString drawAtPoint:NSMakePoint(x, y) 
     withAttributes:attributes]; 

같은 속성, 동일한 입력 위치,보기에서 다른 위치를 통해 보라색 문자열입니다.
그리고 회전 된 텍스트로 인해 더 악화됩니다.


업데이트 # 1

이 보이는 지금 NSString 보 실험

  • NSString sizeWithAttributes:
  • NSBezierPath bounds

에 의해 반환 된 다른 경계 상자까지 끓는처럼 undingRectWithSize

+0

경계 텍스트의 크기와 동일하지 않습니다 .. 갈 수 있어요 : 오프셋 NSBezierPath

는 bezierWithFont에서 돌아왔다. 예를 들어, 큰 로마자 italic * f *는'NSAttributedString size'에 의해 반환 된 상자의 경계를 훨씬 벗어납니다. – hamstergene

+0

그래, 그래서 나는 'boundingRectWithSize'로 바꿨다. 다양한 글꼴 크기에 대한 좋은 소개가 [여기] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/FontHandling/Tasks/GettingFontMetrics)에서 찾을 수 있습니다.html) 여기서 sizeWithAttributes는 외부 바운딩 박스를 사용하고 NSBezierPath bounds는 글리프가 차지하는 실제 영역을 사용합니다. – Jay

답변

0

FWIW - 현재 사용 중입니다.

boundingRectWithSize:options:attributes:NSStringDrawingUsesDeviceMetrics 옵션을 함께 사용하면 그려지는 문자열이 차지하는 실제 경계 상자와 첫 번째 글리프의 오프셋을 포함하여 작업 할 수있는 좋은 텍스트 치수가 제공됩니다. 그 양만큼 당신은 도면의