如何获取UIFont实例的字体大小或粗体版本

40

如何获取 UIFont 实例的字体大小?

或者,有没有人可以为 UIFont 实现这个方法?

- (UIFont *)boldFont;

26
дҪ жғіиҰҒиҺ·еҸ–UIFontзҡ„pointSizeгҖӮ - Deepak Danduprolu
给:@Deepak,pointSize和fontSize是一样的吗? - Míng
4
是的,pointSize会等于你在UIFont构造函数的size:参数中提供的值。如果你阅读UIFont的文档,你会发现fontSize/fontOfSize方法接受或返回点大小。 - titaniumdecoy
@Deepak:你确定吗?为什么它叫pointSize而不是size或fontSize? - Míng
是的,我确定。就像@Jason所提到的那样。 - Deepak Danduprolu
@Deepak:在我提出这个问题之前,我找到了这个 - https://dev59.com/P2445IYBdhLWcg3wapzF#6457434 - Míng
7个回答

39

这是一个旧答案,不再是最佳解决方案,请查看已接受的答案。

-(UIFont *)boldFont{

//First get the name of the font (unnecessary, but used for clarity)
NSString *fontName = self.fontName;

//Some fonts having -Regular on their names. so we have to remove that before append -Bold / -BoldMT
fontName = [[fontName componentsSeparatedByString:@"-"] firstObject];

//Then append "-Bold" to it.
NSString *boldFontName = [fontName stringByAppendingString:@"-Bold"];

//Then see if it returns a valid font
UIFont *boldFont = [UIFont fontWithName:boldFontName size:self.pointSize];

//If it's valid, return it
if(boldFont) return boldFont;

//Seems like in some cases, you have to append "-BoldMT"
boldFontName = [fontName stringByAppendingString:@"-BoldMT"];
boldFont = [UIFont fontWithName:boldFontName size:self.pointSize];

//Here you can check if it was successful, if it wasn't, then you can throw an exception or something.
return boldFont;

}

1
最后:如果(boldFont),则返回boldFont;否则返回self。 - Míng
2
而:NSString *fontName = self.fontName; 应该是 NSString *fontName = self.familyName; // 这样就完美了,谢谢! - Míng
2
在像ArialMT这样的字体中添加-BoldMT是行不通的;它的粗体等价物是Arial-BoldMT,而不是ArialMT-BoldMT - titaniumdecoy

27

要从UIFont实例中获取字体大小,请使用以下方法:

 @property(nonatomic, readonly) CGFloat pointSize

有更多的属性可以用来描述字体大小(例如大写字母、小号等)

capHeight,xHeight,pointSize 

使用以下内容来访问粗体字

UIFont* myboldFont = [UIFont boldSystemFontOfSize:11];

4
'boldFont:'方法完全没有用,它只是'boldSystemFontOfSize:'的一个包装器。很明显@iwill想知道如何将现有的UIFont转换为其粗体对应字体。 - titaniumdecoy

16

UIFontDescriptor 是一个相当强大的类,可以用来获取你想要的字体的 粗体 版本。它应该是完全安全和具有未来性的,因为它只需要使用公共 API,不依赖于任何字符串修改。

以下是Swift 3的代码:

extension UIFont {

    func bold() -> UIFont? {
         let fontDescriptorSymbolicTraits: UIFontDescriptorSymbolicTraits = [fontDescriptor.symbolicTraits, .traitBold]
         let bondFontDescriptor = fontDescriptor.withSymbolicTraits(fontDescriptorSymbolicTraits)
         return bondFontDescriptor.flatMap { UIFont(descriptor: $0, size: pointSize) }
    }

}

这是Objective-C的代码:

@implementation UIFont (RABoldFont)

- (UIFont *)ra_boldFont
{
    UIFontDescriptor *fontDescriptor = [self fontDescriptor];
    UIFontDescriptorSymbolicTraits traits = fontDescriptor.symbolicTraits;
    traits = traits | UIFontDescriptorTraitBold;
    UIFontDescriptor *boldFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:traits];
    return [UIFont fontWithDescriptor:boldFontDescriptor size:self.pointSize];
}

@end

自iOS 7以来,这是最佳答案。 - Míng
[fontDescriptor.symbolicTraits, .traitBold] 是否等同于 fontDescriptor.symbolicTraits.union(.traitBold) - David James

8
这里是找到字体大小的最简单方法。
UIFont *anyFont;
//initialization and other stuff here

现在你想要找到它的尺寸大小

 CGFloat fontSize= [anyFont pointSize];

2
使用NSString+UIKit方法来测量带有某种字体的字符串的大小。
iPhone将同一名称的普通字体和粗体字体视为完全不同的字体,因此没有简单的方法可以在它们之间转换。例如,ArialMT和Arial-BoldMT被操作系统视为完全不同的字体。
编辑:我可能误解了您的问题。也许您正在寻找UIFont的pointSize属性?

0
您可以使用Core Text检查加粗文本。使用kCTFontBoldTrait

0

Swift 3版本的Rafał Augustyniak答案

extension UIFont {


    func boldFont() -> UIFont? {
        let fontDescriptor = self.fontDescriptor
        let fontDescriptorSymbolicTraits: UIFontDescriptorSymbolicTraits = [ fontDescriptor.symbolicTraits, .traitBold ]

        guard let boldFontDesc = fontDescriptor.withSymbolicTraits(fontDescriptorSymbolicTraits) else {
            return nil
        }

        return UIFont(descriptor: boldFontDesc, size: pointSize)
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接