NSString 크기 캡처 구멍

sizeWithAttributes

sizeWithAttributes 정확한 크기를 얻을 수 없습니다.
문자열에 지정한 글꼴에 없는 것이 포함되어 있으면 sizeWithAttributes 정확한 크기를 얻을 수 없습니다.
예를 들어, 등가 배율 글꼴 "Courier"에는 일본어가 포함되지 않습니다.
글꼴에 "Courier"가 지정되어 있으면 문자열에 일본어가 포함되어 있으며 sizeWithAttributes 원래 크기는 반환되지 않습니다.
iOS에서 부족한 부분은 다른 글꼴로 대체하고 문자가 표시되지 않습니다
언뜻 보기에는 어려움이 없지만 상술한 함정에 주의하세요.
이 경우 CoreText도 정확한 크기를 얻을 수 있습니다.
크기 비교 읽어들이기
NSString *text = @"チ";

// 文字装飾
NSMutableDictionary *dictAttr = [NSMutableDictionary dictionary];
[dictAttr setObject:[UIFont fontWithName:@"Courier" size:64.0] forKey:NSFontAttributeName];

/* ********************
 * sizeWithAttributesでサイズ取得
 ******************** */
// サイズ取得
CGSize sizeFont = [text sizeWithAttributes:dictAttr];

// ログ出力
NSLog(@"sizeWith~:%@", NSStringFromCGSize(sizeFont));

/* ********************
 * CoreTextでサイズ取得
 ******************** */
// 装飾文字列の生成
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:text attributes:dictAttr];
//フレームセッターの作成
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attrStr);
// サイズ取得
CGSize contentSize = CTFramesetterSuggestFrameSizeWithConstraints(
                                                                  framesetter,
                                                                  CFRangeMake(0, attrStr.length),
                                                                  nil,
                                                                  CGSizeMake(200, 200),
                                                                  nil);

// ログ出力
NSLog(@"CoreText:%@", NSStringFromCGSize(contentSize));

출력 로그
sizeWith~:{64, 64}
CoreText:{64, 71}
이렇게 하면 size With Attributes의 세로 폭이 작아진다.

drawInRect


이 문제는 drawInRect에서도 확인할 수 있습니다.
draw InRect는 size With Attributes와 같은 인식에 근거하여 묘사의 원점으로?
위 텍스트 그리기
CGRect rectImage = CGRectMake(0, 0, 96.0, 96.0);

// 画像処理開始
UIGraphicsBeginImageContextWithOptions(rectImage.size, NO, 0.0);

// テキストの描画
[text drawInRect:rectImage withAttributes:dictAttr];
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();

// 画像処理終了
UIGraphicsEndImageContext();

64x64의 경우 96x96여분의 충분한 양을 가지고 있어도 칼의 상부에 약간의 결함이 있을 수 있다.
원래 64x71에 있는 곳이에요.drawInRect 64x64로 오인하여 원점이 벗어났다고 여긴다.drawInRect의 y축이 약간 편이되어 상부도 그려진다

총결산


나는 일본어가 포함되지 않은 글씨체의 사용이 결코 희귀하지 않다고 생각한다.
매번 CoreText가 좀 귀찮은 일이라는 것을 깨달아야 한다.

좋은 웹페이지 즐겨찾기