본문 바로가기
개발/ios

쿼츠2D 에서의 문자 출력

by 매몰 2013. 9. 4.

Quartz2D 기반에서 기본적인 방법으로 문자를 출력하려 하면 한글이 출력되지 않는다.

뿐만 아니라 외부폰트도 적용하기 힘들다.


하지만 다행히 해결책은 있다. CoreText 를 이용하면 되는것이다.


먼저 CoreText framework를 등록하고 CTFrameRef를 만들어 CTFrameDraw() 출력하면 된다.


나는 아래와 같이 쓰기 편하게 좌표, 정렬, 크기, 색, 폰트를 매개변수로 하는 함수를 만들어 사용하고 있다.




#define ALIGN_LEFT 0

#define ALIGN_RIGHT 1

#define ALIGN_TOP 2

#define ALIGN_BOTTOM 3

#define ALIGN_CENTER 4


- (CTFrameRef)getFrameText:(NSString *)text :(CGFloat)x :(CGFloat)y :(int)alignx :(int)aligny :(CGFloat)size :(id)color :(NSString *)font {

//문자를 생성한다

    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:text];

    

//폰트를 불러와 생성한다. 이때 폰트에 크기를 설정한다 

    CTFontRef fontref = CTFontCreateWithName((CFStringRef)font), size, NULL);

    

//문자에 생성된 폰트를 넣는다

    [string addAttribute:(id)kCTFontAttributeName value:(__bridge id)fontref range:NSMakeRange(0, [string length])];


//문자에 색을 넣는다

    [string addAttribute:(id)kCTForegroundColorAttributeName value:color range:NSMakeRange(0, [string length])];

    

//문자를 CTFrameRef로 만들기 위해 setter로 변환한다.

    CTFramesetterRef textframesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)string);

    

//정렬을 위해서 문자rect크기를 구한다

    CGSize textsize = [text sizeWithFont:[UIFont fontWithName:font size:size]];


//문자 x,y좌표를 정렬종류에 따라 재배치한다

    switch (alignx) {

        case ALIGN_RIGHT:

            x = x - textsize.width;

            break;

            

        case ALIGN_CENTER:

            x = x - (textsize.width / 2);

            break;

    }

    

    switch (aligny) {

        case ALIGN_TOP:

            y = y - textsize.height;

            break;

            

        case ALIGN_CENTER:

            y = y - (textsize.height / 2);

            break;

    }

    

//문자rect를 설정한다

    CGMutablePathRef textpath = CGPathCreateMutable();

    CGPathAddRect(textpath, NULL, CGRectMake(x, y, textsize.width, textsize.height));

    

//CTFrameRef를 생성한다

    CTFrameRef textframe = CTFramesetterCreateFrame(textframesetter, CFRangeMake(0, 0), textpath, NULL);

    

//자원을 해제한다

    CGPathRelease(textpath);

    CFRelease(textframesetter);

    CFRelease(fontref);

    

    return textframe;

}




끝으로 drawRect에 문자를 출력한다




CTFrameDraw([self getFrameText:@"테스트" :10 :100 :ALIGN_LEFT :ALIGN_CENTER :15.0 :(id)[UIColor colorWithRed:(157.0f/255.0f) green:(126.0f/255.0f) blue:(81.0f/255.0f) alpha:1.0f]], context);





서적과 인터넷에서 얻은 자료를 바탕으로 나름 저의 방식으로 바꾸어서 사용하고 있어요...

오로지 저의취향에 맞췄기 때문에 이상한 부분이 있어도 이해해 주세요ㅎㅎ







 

 매몰: 고영진


 1인 개발자

     실패만 하고 있어도 꿈을 포기하지 않는 남자. 

     제가 직접 경험하고 습득한 지식을 위주로 올릴게요. 







사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기