2010-03-03 5 views
3

나는 여러 페이지로 텍스트를 구문 분석하는 클래스가 있습니다. sizeWithFont : 메서드를 사용하여 한 페이지가 끝나고 다른 페이지가 시작될 때를 식별합니다. 하지만 불행히도 파싱해야 할 텍스트의 양이 꽤 많기 때문에 전체 작업을 백그라운드 스레드에서 수행해야합니다 (완료하는 데 몇 초 걸립니다). 따라서 때로는 인터페이스 (UIKit는 스레드로부터 안전하지 않지만 여러 스레드에서 동시에 호출 함)에서 시각적 인 아티팩트를 얻을 수 있습니다.이를 제거하는 것이 좋습니다.sizeWithFont의 대안 : method

배경 스레드에서 sizeWithFont :를 제거해야합니다. 그러나이 방법의 대안으로 보이지 않습니다. 현재 텍스트 위치를 얻기 위해

  1. 전화 기능 CGContextGetTextPosition : 코어 그래픽과 텍스트의 폭을 찾을 수있는 유일한 방법은 애플의 설명서에 명시된 방법을 사용하는 것입니다.
  2. CGContextSetTextDrawingMode 함수를 사용하여 텍스트 그리기 모드를 kCGTextInvisible로 설정하십시오.
  3. CGContextShowText 함수를 호출하여 텍스트를 그려 현재 텍스트 위치에 텍스트를 그립니다.
  4. CGContextGetTextPosition 함수를 호출하여 최종 텍스트 위치를 결정하십시오.
  5. 텍스트의 너비를 결정하려면 끝 위치에서 시작 위치를 뺍니다.

그러나 나는 이것이 엄청난 성능 손실을 초래할 것이라고 우려하고 있습니다.

누구나 텍스트 너비를 확인할 수있는 또 다른 방법이 있습니까?

답변

1

iPhone OS 3.2 용 애플리케이션을 타겟팅 할 가능성이있는 경우 Core Text을 살펴보십시오.

코어 텍스트 라이브러리 전체가 스레드로부터 완전히 안전하지는 않습니다. 문서에서 :

멀티 코어 고려 사항 : 코어 텍스트의 모든 개별 기능은 스레드로부터 안전합니다. 글꼴 개체 (CTFont, CTFontDescriptor 및 관련 개체)는 여러 작업, 작업 큐 또는 스레드에서 동시에 사용할 수 있습니다. 그러나 레이아웃 개체 (CTTypesetter, CTFramesetter, CTRun, CTLine, CTFrame 및 관련 개체)는 단일 작업, 작업 큐 또는 스레드에서 사용해야합니다.