2012-02-09 2 views
12

UILabel에 맞춤 글꼴을 사용하고 싶습니다.CIFontRef를 UIFont로 변환하는 방법?

NSString *fontPath = ... ; // a TTF file in iPhone Documents folder 
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]); 
CGFontRef customFont = CGFontCreateWithDataProvider(fontDataProvider); 
CGDataProviderRelease(fontDataProvider); 

가 어떻게이 CGFontRefUIFont A를가 [UILabel setFont:]에 사용되는 변환 할 수 있습니다 : 사용자 정의 글꼴 파일에서에 의해로드?

+2

어떤 iOS 버전을 지원해야합니까? Info.plist를 편집하여 번들 된 글꼴을'UIFont' 인스턴스로로드 할 수 있습니다. – Costique

+1

CGFontRef를 UIFont로 변환하는 것에 대해서는 확신이 없지만 CGFontRef를 사용하는 UILabel의 하위 클래스를 만들 수 있습니다. 이 [blog] (http://blog.mro.name/2010/08/uilabel-with-a-custom-cgfont/)에서 확인하십시오. –

+0

@Costique iOS 4.3 이상은 정상입니다.글꼴은 사용자가 앱을 다운로드 한 후 추가되므로 Info.plist를 미리 설정할 수 없습니다. – ohho

답변

15

콘래드의 답변은 비슷하지만 작동하지 않습니다. UIFont에 전체 이름이 아닌 PostScript 이름을 제공해야합니다.

NSString *fontName = (NSString *)CGFontCopyPostScriptName(fontRef); 
UIFont *font = [UIFont fontWithName:fontName size:someSize] 
+0

+1, 올바른 스크립트 이름을 사용해야합니다. 그렇지 않으면 등록에 실패합니다. – ZYiOS

+3

'CGFontCopyPostScriptName'은 나중에'CFRelease'에'CFStringRef'를 할당하고 반환합니다. NSString 반환 값을 캐스팅 가독성에 대한 나쁜 아이디어입니다. –

3

그들은 원칙적으로 직접 변환 할 수 없습니다. 하나의 간단한 이유는 UIFont가 글꼴 크기를 캡슐화하는 반면 CGFont는 크기와 무관합니다 (크기는 그래픽 컨텍스트의 속성이므로 CGContextSetFontSize() 참조). 실제로이 테스트를하지 않은

NSString *fontName = (NSString *)CGFontCopyFullName(someCGFontRef); 
UIFont *font = [UIFont fontWithName:fontName size:someSize]; 
[fontName release]; 

하지만 (아마도 약간의 추가와 함께) 작동합니다 : 당신이 그렇지 않으면 당신은 당신이 뭔가를 할 수 있어야한다, 원하는 글꼴 크기를 결정했다고 가정

. 나는 CGFont와 UIFont의 이름이 일치한다고 믿는다. 그러나 그렇지 않다면 이것은 분명히 작동하지 않을 것이다.

2

CGFont를 CTFont로 변환 할 수는 있지만 불행히도 UIFont을 얻을 수 없습니다. UIFont을 얻는 방법은 다음과 같습니다 : 시스템 글꼴을 요청하거나 PostScript 이름으로 글꼴을 요청하십시오. 따라서 UILabel에서 사용자 정의 글꼴을 사용하려면 후자를 사용하는 것이 좋습니다. 이 글꼴은 당신이 UIFont을 번들에 추가하고 으로로드 할 수 있습니다 미리 사용하여 응용 프로그램을 파일을 알고 있다면

는 + fontWithName : 크기 : UIFont로 그와 글꼴 파일을 번들을 검색 포스트 스크립트 이름. 예를 들어

는 트루 타입 글꼴 파일 "VeraMono.ttf는"포스트 스크립트 이름 "비트 스트림 베라 산세 모노"을 가지고, 그래서이 같은 UILabel의에 장전 :

label.font = [UIFont fontWithName:@"Bitstream Vera Sans Mono" size:12];

포스트 스크립트 이름에 비를 얻을 수 동적으로 글꼴 도구를 사용하거나 위의 경우 PostScript 이름은 Finder> 정보 입수를 통해 "전체 이름"표시와 동일하게됩니다.

그러나 사전에 글꼴의 PostScript 이름을 미리 알지 못하는 경우 (예 : 사용자 정의 글꼴 지원), NSData에 파일 이름을로드하고 PostScript 이름으로 "grep"을로드 할 수 있습니다.

행운을 빕니다,

+0

설명해 주셔서 감사합니다. Josh Brown의 대답으로 당신의 반응은 4 년 후 나를 도왔습니다! –

15

직접 CGFontRefUIFont에 변환 할 수 없습니다하지만 당신은 CTFontManagerRegisterGraphicsFont를 사용 CGFontRef를 등록하고 UIFont 해당 만들 수 있습니다.

NSString* fpath = [documentsDirectory stringByAppendingPathComponent:@"custom_font_file_name.ttf"]; 
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fpath UTF8String]); 
CGFontRef customFont = CGFontCreateWithDataProvider(fontDataProvider); 
CGDataProviderRelease(fontDataProvider); 
NSString *fontName = (__bridge NSString *)CGFontCopyFullName(customFont); 
CFErrorRef error; 
CTFontManagerRegisterGraphicsFont(customFont, &error); 
CGFontRelease(customFont); 
UIFont* uifont = [UIFont fontWithName:fontName size:12]; 
+0

이 오류가 발생했습니다 글꼴을로드하지 못했습니다 : 작업을 완료 할 수 없습니다. (com.apple.coretext 오류 105 - CGFont 'CGFont (0x89919a0) : Melville>'을 등록 할 수 없습니다.) – Durgaprasad

+0

documentsDirectory .. "선언되지 않은 식별자 'documentsDirectory 사용 ...? ? – Morkrom

+2

오류 105 = 글꼴이 이미 등록되었습니다. – dulgan