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);
서적과 인터넷에서 얻은 자료를 바탕으로 나름 저의 방식으로 바꾸어서 사용하고 있어요...
오로지 저의취향에 맞췄기 때문에 이상한 부분이 있어도 이해해 주세요ㅎㅎ
'개발 > ios' 카테고리의 다른 글
이미지를 회전시키고 재사용하는 꿀팁 (0) | 2017.02.22 |
---|---|
쿼츠2D로 자유롭게 폰트 크기를 바꿔보자 (0) | 2016.12.19 |
역시 스레드는 필수! 아이폰과 안드로이드의 기본 스레드 사용법 비교 (0) | 2014.12.06 |
[아이폰] 간단하고 편리한 난수 발생 함수 만들기 (0) | 2014.06.22 |
아이폰용 게임을 만드는 네가지 방법 (0) | 2013.08.24 |