iOS : 석영을 사용하여 문자열의 너비와 높이를 어떻게 측정합니까?
-
06-09-2019 - |
문제
내 질문을하기 전에 이것은 Apple의 문서에서 나온 것입니다. Quartz를 사용하여 문자열의 너비를 결정하는 방법 :
텍스트 측정이 애플리케이션에 중요한 경우 Quartz 2D 기능을 사용하여 계산할 수 있습니다. 그러나 먼저 강도가 텍스트 레이아웃 및 측정에있는 ATSUI 사용을 고려할 수 있습니다. ATSUI에는 텍스트 메트릭을 얻는 몇 가지 기능이 있습니다. 층 후 텍스트 메트릭을 얻을 수있을뿐만 아니라 드문 경우 필요한 경우 텍스트 전 메트릭을 얻을 수 있습니다. 계산을 직접 수행 해야하는 쿼츠와 달리 ATSUI는 측정 값을 계산합니다. 예를 들어, ATSUI 함수를 AtSumeasureTextImage로 호출하여 텍스트에 대한 이미지 경계 사각형을 얻을 수 있습니다.
석영 텍스트가 Atsui (또는 Cocoa)보다 필요에 더 적합하다고 결정하면 쿼츠가 그려지기 전에 다음 단계를 따라 텍스트 너비를 측정 할 수 있습니다.
- 현재 텍스트 위치를 얻으려면 함수 CGContextGetTextPosition을 호출하십시오.
- 텍스트 드로잉 모드를 함수 cgcontextsettextDrawingMode를 사용하여 kcgtextinvisible로 설정하십시오.
- 함수 cgcontextshowtext를 호출하여 텍스트를 그려 현재 텍스트 위치에서 텍스트를 그립니다.
- 함수 cgcontextGetTextPosition을 호출하여 최종 텍스트 위치를 결정하십시오.
- 텍스트의 너비를 결정하려면 결말 위치에서 시작 위치를 빼십시오.
내 질문은 다음과 같습니다.
이것이 코어 그래픽을 사용하여 문자열의 너비를 결정하는 가장 좋은 방법입니까? 어리석은 것처럼 보이고 내 텍스트가 2D 그래픽 요소와 공존하기 때문에 모든 렌더링에 동일한 컨텍스트를 사용하고 싶습니다. 나는 다음과 같은 소형 방법이 있기를 바랐다.
CGContextGetTextWidthAndHeight(context, text);
Atsui는 구식이며 핵심 텍스트로 대체 될 것이라고 읽었습니다. 그게 사실이고 그렇다면 iOS에 있습니까?
해결책
iPhone SDK에는 방법에 대한 방법이 있습니다. NSString
그것은 당신이 원하는 것을 제공합니다.
iOS 7.0 기준으로 이 방법은 다음과 같습니다:
- boundingRectWithSize:options:attributes:context:
- sizeWithAttributes:
이전 버전의 iOS에서 우리는 이것들을 가득 채웠습니다.
– sizeWithFont:
– sizeWithFont:forWidth:lineBreakMode:
– sizeWithFont:constrainedToSize:
– sizeWithFont:constrainedToSize:lineBreakMode:
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
다른 팁
UI 스레드 이외의 스레드에서 드로잉 작업을 수행 할 때 설명한 기술을 사용해야합니다. 이것은 백그라운드 스레드에서 비동기 적으로 렌더링하거나 다른 이유로 배경에 사용자 정의 그래픽을 그릴 때 CatileDlayer와 같은 것을 사용할 때 특히 중요합니다.
"간단한"그래픽을 수행 할 때 PGB에 동의하며 기본 스레드에서 실행중인 보장됩니다. 그러나 SizewithFont는 설명한 기술과 동일한 작업을 수행하고 있습니다. 단순히 UigraphicsGetCurrentContext ()를 사용하여 수행하는 것입니다.