36

オブジェクトがあるUIFont場合、太字に変換できますか? フォント名はわかりません。UIFont オブジェクトしかありません。私が欲しいのは次のような関数です

UIFont *boldFontFromFont(UIFont *input)
{
    return [input derivedFontWithFontWeight:UIFontWeightBold];
}

動作するようにコードを変更するにはどうすればよいですか。(上記のコードは機能しません。要点を説明するために作成しただけです。)

前もって感謝します。

4

8 に答える 8

97

iOS 7 では、新しいUIFontDescriptorクラスが導入され、より簡単になりました。

UIFont *font = [UIFont fontWithName:@"Helvetica Neue" size:12];
NSLog(@"plain font: %@", font.fontName); // “HelveticaNeue”

UIFont *boldFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold] size:font.pointSize];
NSLog(@"bold version: %@", boldFont.fontName); // “HelveticaNeue-Bold”

UIFont *italicFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic] size:font.pointSize];
NSLog(@"italic version: %@", italicFont.fontName); // “HelveticaNeue-Italic”

UIFont *boldItalicFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic] size:font.pointSize];
NSLog(@"bold & italic version: %@", boldItalicFont.fontName); // “HelveticaNeue-BoldItalic”

Cocoa (macOS) に相当するものを探してここに来た人のために、10.3 以降で利用可能な からUIFontDescriptor来ています。NSFontDescriptor

于 2014-01-26T16:44:40.080 に答える
14

ボールド フォントを取得するには、フォント ファミリからフォントの特定の名前を渡す必要があります。特定のフォントからフォント ファミリ名を取得し、このファミリのすべてのフォントを一覧表示できます。一般に、ボールド フォントには名前に「bold」が含まれますが、形式は厳密ではなく、たとえば「Helvetica-BoldOblique」などのバリエーションが存在する可能性があります。次のコードから開始できます。

- (UIFont *)boldFontFromFont:(UIFont *)font
{
    NSString *familyName = [font familyName];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName];
    for (NSString *fontName in fontNames)
    {
        if ([fontName rangeOfString:@"bold" options:NSCaseInsensitiveSearch].location != NSNotFound)
        {
            UIFont *boldFont = [UIFont fontWithName:fontName size:font.pointSize];
            return boldFont;
        }
    }
    return nil;
}
于 2013-04-15T13:23:45.440 に答える
7

システム フォントの不可解なフォント ファミリー名が原因で、iOS 7 以降、フォントまたはファミリー名を使用してボールド/イタリック フォントを派生させようとすると、正しく機能しなくなりました。以下は、UIFontDescriptor クラスを使用してボールド/イタリック フォントを派生させる単純な拡張です。

+(UIFont *) font:(UIFont *)font bold:(BOOL)bold italic:(BOOL)italic
{
    NSUInteger traits = 0;
    if (bold)
    {
        traits |= UIFontDescriptorTraitBold;
    }
    if (italic)
    {
        traits |= UIFontDescriptorTraitItalic;
    }
    return [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:traits] size:font.pointSize];
}
于 2014-02-10T06:45:47.787 に答える
2

Swiftで太字の UIFonts を検索すると、この質問がポップアップするため、ここに新鮮な答えがあります。

extension UIFont {
    /// Returns a new font in the same family with the given symbolic traits,
    /// or `nil` if none found in the system.
    func withSymbolicTraits(_ traits: UIFontDescriptor.SymbolicTraits) -> UIFont? {
        guard let descriptorWithTraits = fontDescriptor.withSymbolicTraits(traits)
            else { return nil }
        return UIFont(descriptor: descriptorWithTraits, size: 0)
    }
}

例:

myFont.withSymbolicTraits(.taitBold) // returns the bold version of myFont
于 2019-02-23T18:17:26.473 に答える