은 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()
으로 전화해야합니다.
그 코드를 살펴 보았지만 여러 글리프 경로를 구성하기 위해 개별 글리프에 액세스 할 수있는 부분을 찾을 수 없습니다. – openfrog
맞습니다.이 코드는 한 줄의 텍스트만을 처리합니다. 내 대답을 편집하여 연장 (시간이 걸릴 수 있음). –
몇 가지 아이디어를 제공하기 위해 답을 수정했습니다. –