ふるすたっくえんじにあっぽい人の日記

ASP .NET MVC (C#)、.NET Framework、iOS (Objective-c) アプリ、Androidアプリ (Java)、AWS、たまにLAMPとかプロジェクトマネジメントあたりのお話

【iOS】UILabelの高さを求める カスタムフォント対応版

ひさびさiOS
でーもーさーらーすーだーけー
日本語の情報どこにもなかったし?
deltaの計算はどっかから持ってきたのをごにょごにょしただけなので、0.2とか0.5は何の値だか不明w
まぁ、ちゃんと動くっぽい。
メソッド呼ぶ前にtextとfontとview.widthが設定されているのが前提ー
あんま好きじゃないけど、こっちのほうが実用的かなーと。
iOSメソッド長くなるから嫌いねー

#import <CoreText/CoreText.h>

@implementation UILabel (Helper)

- (void)adjustHeightWithMinHeight:(CGFloat)minHeight
{
    CTFontRef ctFont = CTFontCreateWithName((CFStringRef)self.font.fontName, self.font.pointSize, NULL);
    CGFloat leading = CTFontGetLeading(ctFont);
    if (leading > 0)
        leading = floor(leading + 0.5);
    CGFloat delta = 0;
    if (leading <= 0) {
        CGFloat ascent = CTFontGetAscent(ctFont);
        CGFloat descent = CTFontGetDescent(ctFont);
        delta = floor (0.2 * floor(ascent + 0.5) + floor(descent + 0.5) + leading + 0.5);
    }
    
    CGSize maximumLabelSize = CGSizeMake(self.frame.size.width, FLT_MAX);
    CGSize expectedLabelSize = [self.text boundingRectWithSize:maximumLabelSize options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName : self.font } context:nil].size;
    
    self.frame.size.height = MAX(minHeight, expectedLabelSize.height + delta);
}

@end