I use a custom category on UIFont to get a preferred font with a restriction like this
@implementation UIFont (preferredFontWithSizeLimit)
+ (UIFont *)preferredFontWithTextStyle:(UIFontTextStyle)style maxSize:(CGFloat)maxSize {
UIFontDescriptor *fontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:style];
if (fontDescriptor.pointSize <= maxSize)
return fontDescriptor;
return [UIFont fontWithDescriptor:fontDescriptor size:maxSize];
}
@end
, , - ( )
+ (UIFont *)limitedPreferredFontForTextStyle:(UIFontTextStyle)style {
static NSDictionary *sizeLimitByStyle;
static dispatch_once_t once_token;
dispatch_once(&once_token, ^{
sizeLimitByStyle = @{
UIFontTextStyleTitle1: @56,
UIFontTextStyleTitle2: @44,
UIFontTextStyleTitle3: @40,
UIFontTextStyleHeadline: @34,
UIFontTextStyleSubheadline: @30,
UIFontTextStyleBody: @34,
UIFontTextStyleCallout: @32,
UIFontTextStyleFootnote: @26,
UIFontTextStyleCaption1: @24,
UIFontTextStyleCaption2: @22,
};
});
CGFloat sizeLimit = INFINITY;
NSNumber *limit = sizeLimitByStyle[style];
if (limit)
sizeLimit = limit.doubleValue;
return [UIFont preferredFontWithTextStyle:style sizeLimit:sizeLimit];
}
4+
extension UIFont {
static func preferredFont(withTextStyle textStyle: UIFont.TextStyle, maxSize: CGFloat) -> UIFont {
let fontDescriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: textStyle)
let font = UIFont(descriptor: fontDescriptor, size: fontDescriptor.pointSize)
let maxFont = UIFont(descriptor: fontDescriptor, size: maxSize)
return fontDescriptor.pointSize <= maxSize ? font : maxFont
}
}