冬は寒い!
見習いプログラマーの naopon です!
前回の画像からテキストの輪郭を切り抜く①の使い方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//使い方の例 { //元画像 UIImage *img = [UIImage imageNamed:@"sample"]; //元画像に収まるテキストのサイズ CGSize txtSize = CGSizeZero; txtSize.width = img.size.width/[[UIScreen mainScreen] scale] - 10.f; txtSize.height = img.size.height/[[UIScreen mainScreen] scale] - 10.f; //切り抜くテキスト NSString *punchingText = @"あああ\nあいうえお"; //フォントサイズ最適化 UIFont *font = [self adjustWithFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:100] minSize:10 constrainedToSize:txtSize forText:punchingText]; //切り抜き画像生成 UIImage *punchingImg = [img imageByPunchingText:punchingText fontSize:font.pointSize fontName:font.fontName fontColor:[UIColor clearColor] lineSpacing:10.0f textAlignment:NSTextAlignmentCenter]; } |
仮に下記みたいな「指定サイズ内に収まるフォントを返す」ような関数があったとして。
上記のコードのような感じで使用します。
おぉぉ完成!!
画像を用意できなくて、ブログ内容が大変見にくくなっておりますが。。。
画像からテキストの輪郭パスを切り抜けたから
良しとしよう ( ^ o^)!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
/** * 指定サイズ内に収まるフォント * @param baseFont ベースフォント * @param minSize 最小フォントサイズ * @param toSize 納めたいビューサイズ * @param text 表示させたいテキスト * @return サイズに収まるフォント */ - (UIFont *)adjustWithFont:(UIFont *)baseFont minSize:(CGFloat)minSize constrainedToSize:(CGSize)toSize forText:(NSString *)text { UIFont *font = baseFont; @autoreleasepool { CGFloat maxSize = font.pointSize; CGSize constraintSize = CGSizeMake(toSize.width, MAXFLOAT); NSRange range = NSMakeRange(minSize, maxSize); int fontSize = 0; for (NSInteger i = maxSize; i > minSize; i--) { @autoreleasepool { fontSize = ceil(((float)range.length + (float)range.location) / 2.0); font = [font fontWithSize:fontSize]; NSDictionary *attributes = @{ NSFontAttributeName : font }; NSAttributedString *string = [[NSAttributedString alloc] initWithString:([NSObject isNULL:text])?@"":text attributes:attributes]; CGSize size = [string boundingRectWithSize:constraintSize options:NSStringDrawingUsesLineFragmentOrigin context:nil].size; if (size.height <= toSize.height) range.location = fontSize; else range.length = fontSize - 1; if (range.length == range.location) { font = [font fontWithSize:range.location]; break; } } } } return font; } |