2011-09-27 4 views
2

API가이를 지원합니까? 그렇지 않다면 어떻게 할 수 있습니까?iOS에서 여러 줄 문자열 또는 여러 줄 레이블을 CGPath로 만드는 방법은 무엇입니까?

핵심 텍스트에 CTFontCreatePathForGlyph이 있으며, 한 문자를 경로로 번역 할 수 있습니다. 루프를 사용하여 문자열을 경로로 만들 수 있지만 간격과 커닝 및 다른 모든 불쾌한 점을 처리해야합니다. 같은 글꼴과 크기의 UILabel에 그려진 경우 동일한 것으로 보이는 문자열 경로를 찾고 있습니다.

답변

2

Ohmu에 의해 상당히 광범위하게 다루는 기사가 있습니다. 나는이 코드를 시험해 보았다.

하지만 Core Text를 사용하므로 렌더링은 UILabel과 다를 수 있습니다. 또한 샘플 기사에서는 한 줄만 처리합니다. 여러 줄로 확장하려면 전체 핵심 텍스트 시스템을 설정해야합니다. 대신에 :

CTLineRef line = CTLineCreateWithAttributedString(attStr) ; 

당신은 코어 텍스트 프로그래밍 가이드에 설명 된대로 CTFramesetterRef (CTFramesetterCreateWithAttributedString)와 CTFrameRef (CTFramesetterCreateFrame)를 설정해야합니다. 그런 다음 CTFrameGetLines()을 사용하여 프레임의 모든 라인을 가져올 수 있습니다.

당신은 샘플 문서의 for 루프를 감싸는 것 :

CFArrayRef runArray = CTLineGetGlyphRuns(line); 

// for each RUN 
for (CFIndex runIndex = 0; runIndex < CFArrayGetCount(runArray); runIndex++) 

를 다른 루프로 모든 라인을 반복하는. 루프의 내부 코어는 동일해야합니다.

예제 기사에서는 그래픽 컨텍스트를 만들고 단일 문양의 경로를이 컨텍스트 경로에 추가하지만 CGMutablePathRef 또는 UIBezierPath을 쉽게 만들고 해당 개체에 단일 글리프의 경로를 추가 할 수 있습니다.

테스트하지 않고 나에게 100 % 명확하지 않은 한 가지는 최종 경로에서 글리프의 수직 위치를 조정하는 방법입니다. 각 라인의 위치를 ​​얻고이 위치를 렌더링 된 각 글리프 (아마도 텍스트 행렬로 변환 한 후)에 추가하려면 아마도 CTFrameGetLineOrigins()으로 전화해야합니다.

+0

그 코드를 살펴 보았지만 여러 글리프 경로를 구성하기 위해 개별 글리프에 액세스 할 수있는 부분을 찾을 수 없습니다. – openfrog

+0

맞습니다.이 코드는 한 줄의 텍스트만을 처리합니다. 내 대답을 편집하여 연장 (시간이 걸릴 수 있음). –

+0

몇 가지 아이디어를 제공하기 위해 답을 수정했습니다. –

2

이 프로젝트의 UIBezierPath + TextPaths 범주를 확인하십시오 : https://github.com/aderussell/string-to-CGPathRef.

단일 및 다중 줄 문자열에 대한 경로를 만드는 방법과이를 CAShapeLayers와 함께 사용하는 방법을 보여줍니다.

카테고리는 단지 래퍼이며 내부 기능은 iOS 또는 Mac OS X에서 사용할 수 있습니다. 프로젝트를 CoreText 프레임 워크에 연결하기 만하면됩니다.

+0

매력처럼 작동합니다! – CoderSaru