【问题标题】:Custom font in a storyboard?故事板中的自定义字体?
【发布时间】:2012-02-23 20:00:07
【问题描述】:

我的 iOS 项目中添加了一种字体。它在项目中,并在项目构建时复制。它似乎是一种有效的字体,如果我通过应用程序列出设备上的所有字体,它就会显示出来。我已正确设置 plist 以包含字体。我似乎无法在 Xcode 4.2 的故事板部分中的文本控件、按钮等中使用它。此外,它似乎不允许我输入字体名称,它迫使我使用字体对话框。我也尝试在系统中安装此字体,但似乎无法让它显示在此列表中。我需要仅在代码中执行此操作,还是可以通过情节提要界面执行此操作?

请注意,我可以在代码中完成此操作,但通过情节提要执行此操作会更方便。

【问题讨论】:

  • 找到了一个可能的“完全转换”工具,它在编程上可能不那么痛苦,但仍然没有关于 IB 或故事板的消息。它的工作原理是这样的: [[UITextView 外观] setFont:[UIFont fontWithName:@"font name" size:18]];
  • 一年多过去了,仍然没有任何消息。让我们希望在 WWDC 前后解决这个问题!

标签: iphone ios cocoa-touch storyboard custom-font


【解决方案1】:

更新:Xcode 6 Interface Builder 现在允许您选择自定义字体并在设计时正确呈现它们。

我知道这个问题已经很老了,但我一直在努力寻找一种简单的方法来为 iOS 5 轻松地在 Storyboard(或 Interface Builder)中指定自定义字体,我找到了一个非常方便的解决方案。

首先,请确保您已按照this tutorial 将字体添加到项目中。还要记住,UINavigationBar、UITabBar 和 UISegmentedControl 自定义字体可以使用UIAppearance proxysetTitleTextAttributes: 方法指定。

为 UIButton、UITextField、UILabel 和任何其他需要自定义字体的组件添加以下类别。类别只是实现了一个新属性fontName,它改变了元素的当前字体,同时保持了字体大小。

要在 Storyboard 中指定字体,只需选择所需的元素(标签、按钮、文本视图等)并添加 用户定义的运行时属性,并将 Key Path 设置为String 类型的 fontName 和您的自定义字体名称的值。

就是这样,您甚至不需要导入类别。这样你就不需要为每个需要自定义字体的 UI 组件提供一个插座,也不需要手动编写代码。

考虑到字体不会显示在 Storyboard 中,但在您的设备或模拟器上运行时您会看到它。


分类文件

UIButton+TCCustomFont.h

#import <UIKit/UIKit.h>

@interface UIButton (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end

UIButton+TCCustomFont.m

#import "UIButton+TCCustomFont.h"

@implementation UIButton (TCCustomFont)

- (NSString *)fontName {
    return self.titleLabel.font.fontName;
}

- (void)setFontName:(NSString *)fontName {
    self.titleLabel.font = [UIFont fontWithName:fontName size:self.titleLabel.font.pointSize];
}

@end

UILabel+TCCustomFont.h

#import <UIKit/UIKit.h>

@interface UILabel (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end

UILabel+TCCustomFont.m

#import "UILabel+TCCustomFont.h"

@implementation UILabel (TCCustomFont)

- (NSString *)fontName {
    return self.font.fontName;
}

- (void)setFontName:(NSString *)fontName {
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}

@end

UITextField+TCCustomFont.h

#import <UIKit/UIKit.h>

@interface UITextField (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end

UITextField+TCCustomFont.m

#import "UITextField+TCCustomFont.h"

@implementation UITextField (TCCustomFont)

- (NSString *)fontName {
    return self.font.fontName;
}

- (void)setFontName:(NSString *)fontName {
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}

@end

也可下载from GISTa single file

疑难解答

如果由于未指定 fontName 属性而遇到运行时错误,只需在项目设置的 Other linker Flags 下添加标志 -all_load 以强制链接器包含类别。

【讨论】:

  • 这是一个很好的答案,它(几乎)正是我想要的。不过,如果您正在为 iOS 6(在我的情况下为 Xcode 4.6.3)开发,您将需要再采取一步才能显示您的自定义字体。在导航器中点击您的项目并转到 TARGETS -> Build Phases,然后点击 Copy Bundle Resources 面板底部的 + 按钮。选择您的自定义字体文件,它应该会显示在列表中。
  • 有一点需要注意,因为我一直错过它:一旦你创建了一个新的用户定义的运行时属性,并输入 keypath 的名称,如果你在选择字符串之前没有按 enter键入,您刚刚输入的密钥路径将重置。我一直想知道为什么我会收到一个 keypath 错误,这就是原因。
  • 我尝试使用“用户定义的运行时属性”,但出现以下错误:“UILabel 此类与键 fontName 的键值编码不兼容。”知道我缺少什么吗?
  • @Tommecpe 您错过了故障排除部分中的最后一步
  • 我按照情节提要中自定义字体的所有步骤操作,并且使用的是 xcode 5.1 ...但出现运行时错误。
【解决方案2】:

来自 Xcode6.0 ,如 Xcode6.0 release 注意:

Interface Builder 在设计时呈现嵌入的自定义 iOS 字体,以更准确的尺寸预览最终应用的外观。

您可以在storyboard中设置标签字体。您可以按照以下方式进行

  1. 获取自定义字体文件(.ttf,.ttc)

  2. 将字体文件导入您的 Xcode 项目

  3. app-info.plist中,添加一个名为应用程序提供的字体的键。它是一个数组类型,将你所有的字体文件名添加到数组中,注意:包括文件扩展名。

  1. 在storyboard中,拖一个UILabel到你的界面,选择label,然后导航到Attribute Inspector,点击Font select area右侧的图标按钮。在弹出的面板中,选择FontCustom,并选择您嵌入的字体名称的Family

参考

【讨论】:

  • TCCustomFont 在我的 xcode 6 中不起作用。所以我使用这种方法及其工作。
  • 值得注意的是,此方法与 UILabel 完美配合,但不适用于 UITextFields。我仍在试图弄清楚如何......我猜实时属性会解决它
  • 这仅在使用纯 UILabel 时有效,不适用于带有属性文本的 UILabel。
【解决方案3】:

这是 XCode 中的一个错误,自 3.x 以来一直存在,但仍未修复。我也遇到过同样的问题,甚至尝试将其添加到我的系统中,但没有成功。这是另一个关于它的 SO 帖子 Fonts not displaying in Interface Builder

【讨论】:

  • 我环顾四周,似乎无法发现这是苹果公司的一个已知问题......你知道这个问题的来源吗?
【解决方案4】:

Monjer 的答案是正确的。如果你和我一样,在编译后看不到添加的字体,请确保将字体添加到构建阶段(目标 -> 构建阶段 -> 复制捆绑资源 -> 添加字体文件)

【讨论】:

    【解决方案5】:

    从 XCode 9.4 开始,XCode 仍然不直接在情节提要中尊重字体。您可以在设计时看到它们,但在运行时看不到。如果你使用 fontWithName API,你会知道它返回 nil,但是当在 storyboard/xib 中使用时,没有办法知道它为什么不出现。

    • 确保它在运行时从 Storyboard/XIB 轻松运行的唯一方法是将 .ttc/.ttf 添加到 Copy Bundle Resources 构建阶段。

    • 从 9.4 开始,似乎不再需要将字体文件名添加到 info.plist。

    【讨论】:

      【解决方案6】:

      redent84 的解决方案很棒!

      我只是添加一个改进,在 NSObject 上添加类别,所以你只需要做一次。

      NSObject+CustomFont.h

      #import <Foundation/Foundation.h>
      
      @interface NSObject (CustomFont)
      
      @property (strong, nonatomic) NSString *fontName;
      @property (strong, nonatomic) UIFont *font;
      
      @end
      

      NSObject+CustomFont.m

      #import "NSObject+CustomFont.h"
      
      @implementation NSObject (CustomFont)
      
      @dynamic font;
      
      - (NSString *)fontName
      {
          return self.font.fontName;
      }
      
      - (void)setFontName:(NSString *)fontName
      {
          self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
      }
      
      @end
      

      【讨论】:

      • 好主意。遗憾的是 UIButton 类的 font 属性自 iOS 3.0 以来已被弃用,因此不建议将其用于 UIButtons。
      【解决方案7】:

      这些都不适合我,但确实如此。

      #import <UIKit/UIKit.h>
      
      @interface UILabelEx : UILabel
      
      
      @end
      
      #import "UILabelEx.h"
      #import "Constants.h"
      
      @implementation UILabelEx
      
      - (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
          [super traitCollectionDidChange: previousTraitCollection];
      
          self.font = [UIFont fontWithName:APP_FONT size:self.font.pointSize];   
      }
      @end
      

      【讨论】:

        猜你喜欢
        • 2016-07-04
        • 2016-12-17
        • 2023-03-08
        • 2016-02-28
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 2013-09-14
        • 1970-01-01
        相关资源
        最近更新 更多