故事板中可以使用自定义字体吗?

时间:2019-02-01 10:07:49

标签: ios xcode fonts uistoryboard

有没有办法在情节提要中使用自定义字体?这里的目的是通过情节提要板本身覆盖组件样式并反映字体。以便可以从一个地方将FontA更改为FontB。我知道可以通过代码来完成,但是约束是很多用户界面都是在情节提要中设计的,并且没有创建许多出口。

我只是想知道是否有可能?

4 个答案:

答案 0 :(得分:0)

是的,可以在情节提要中使用自定义字体。

  1. 将字体文件添加到您的Xcode项目中。
  2. Info.plist中注册字体:
UIAppFonts : 
Item 0 : MyCustomFont.ttf

您的字体现在应该显示在情节提要中。

有关更多信息,请参考Apple Docs

答案 1 :(得分:0)

是的。您可以在故事板中使用自定义字体。

请按照以下步骤操作:

  • 在XCode项目中包含字体。
  • 确保它们已包含在目标中。
  • 仔细检查您的字体,将其作为资源包含在捆绑软件中。
  • 在应用程序plist中包括iOS自定义字体。
  • 查找字体名称。

    您可以找到带有以下代码段的字体名称:

    override func viewDidLoad() {
     super.viewDidLoad()
     for family: String in UIFont.familyNames
      {
        print(family)
        for names: String in UIFont.fontNames(forFamilyName: family)
        {
           print("== \(names)")
        }
       }
     }
    
  • 现在您可以使用此字体名称并从情节提要中设置字体。

检查:https://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/

这可能会对您有所帮助。

答案 2 :(得分:0)

是的,您可以在情节提要中使用它们。将自定义字体文件添加到应用程序资源中,并在info.plist中提及它们。在这里,我将bwnistageometricdemo-regular添加到info.plist。

<key>UIAppFonts</key> <array> <string>bwnistageometricdemo-regular.ttf</string> </array>

您可以从情节提要中使用它-

enter image description here

答案 3 :(得分:0)

我们发现了两种方法: 1.使用方法 2.为UIFont创建类别并覆盖方法

#import "SystemFontOverride.h"

@implementation UIFont (SystemFontOverride)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
// do your override
+ (UIFont *)systemFontOfSize:(CGFloat)fontSize {
    UIFont *font = [UIFont fontWithName:@"Raleway-Regular" size:fontSize];
    if (font != nil) {
        return font;
    }
    return [UIFont systemFontOfSize:fontSize];
}

+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize {
    UIFont *font = [UIFont fontWithName:@"Raleway-Bold" size:fontSize];
    if (font != nil) {
        return font;
    }
    return [UIFont systemFontOfSize:fontSize];
}
+ (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize {
    UIFont *font = [UIFont fontWithName:@"Raleway-Italic" size:fontSize];
    if (font != nil) {
        return font;
    }
    return [UIFont systemFontOfSize:fontSize];
}

+ (UIFont *)systemFontOfSize:(CGFloat)fontSize weight:(UIFontWeight)weight NS_AVAILABLE_IOS(8_2) {
    NSString *fontName;
    if (weight == UIFontWeightSemibold) {
        fontName = @"Raleway-SemiBold";
    } else if (weight == UIFontWeightBold) {
        fontName = @"Raleway-Bold";
    } else if (weight == UIFontWeightRegular){
        fontName = @"Raleway-Regular";
    } else if (weight == UIFontWeightMedium){
        fontName = @"Raleway-Medium";
    } else if (weight == UIFontWeightThin){
        fontName = @"Raleway-Thin";
    } else if (weight == UIFontWeightBlack) {
        fontName = @"Raleway-Black";
    }
    if (fontName != nil && fontName.length > 0) {
        UIFont *font = [UIFont fontWithName:fontName size:fontSize];
        if (font != nil) {
            return font;
        }
    }
    return [UIFont systemFontOfSize:fontSize];
}

- (instancetype)initWithCoder:(NSCoder *)coder
    {
        if (self) {
            BOOL result = [coder containsValueForKey:@"UIFontDescriptor"];
            if (result) {
                UIFontDescriptor *descriptor = [coder decodeObjectForKey:@"UIFontDescriptor"];

                NSString *fontName;
                if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontRegularUsage"]) {
                    fontName = @"Raleway-Regular";
                }
                else if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontEmphasizedUsage"]) {
                    fontName = @"Raleway-Bold";
                }
                else if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontObliqueUsage"]) {
                    fontName = @"Raleway-Italic";
                }
                else {
                    fontName = descriptor.fontAttributes[@"NSFontNameAttribute"];
                }
                return [UIFont fontWithName:fontName size:descriptor.pointSize];
            }
        }
        return self;
    }


#pragma clang diagnostic pop
@end

另一个问题是覆盖实现我们需要使用initWithCoder的情节提要中设置的systemFont。

感谢您的上述所有回答,但我发现这种方法更有效,而且可以在更短的时间内提供完整的报道。现在,我可以创建字体枚举并可以设置要更改的任何内容,而不必担心是否从情节提要或代码中设置了字体。