以编程方式将 UILabel 字体设置为用户定义的运行时属性

Posted

技术标签:

【中文标题】以编程方式将 UILabel 字体设置为用户定义的运行时属性【英文标题】:programmatically set UILabel font to User Defined Runtime Attribute 【发布时间】:2014-07-24 05:14:24 【问题描述】:

我有一个UIViewController,我在它的viewDidLoad: 中以编程方式创建了一个UILabel,如下所示:

- (void)viewDidLoad

    UILabel  *navTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(17, 0, 100, 100)];

    navTitleLabel.backgroundColor = [UIColor clearColor];
    navTitleLabel.textAlignment = NSTextAlignmentCenter;
    navTitleLabel.textColor=[UIColor colorWithHexString:@"#000029"];

    [navTitleLabel setFont:[UIFont fontWithName:@"Pennyscript" size:20]];

    self.navigationItem.titleView = navTitleLabel;

我在ViewController's 身份检查器选项卡中设置了“用户定义的运行时属性”:

我在这里尝试以编程方式将UILabel navTitleLabel 的字体设置为我的自定义字体,然后将UILabel 添加到navigationBar's titleView。我究竟做错了什么?我怎样才能实现这个目标?

使用 VC ID-inspector 中的 UDKA(User defined key attribute),应用程序崩溃并显示以下堆栈跟踪消息:

由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类与键 fontName 的键值编码不兼容。”

当我从 ViewController 中删除我的 用户定义的键属性时,我可以导航到 VC 而不会崩溃。

【问题讨论】:

您是否在 Info Plist 文件中将字体添加到您的项目中?以及对应的.ttf-文件? 是的。我已经这样做了。我已经在情节提要中使用了 UILabel 上的字体。但是这个 UILabel 是程序化的,所以我很困惑。 hmm,通常你不必定义 用户定义属性 然后......就像你一样在代码中使用字体就足够了。 您确定 Pennyscript 是正确的字体名称吗?您可以使用以下问题的答案检查自定义字体的正确字体名称:***.com/questions/15984937/… 用户定义运行时属性[navTitleLabel setValue:@"NavBar Title" forKeyPath:@"fontName"]这行是多余的,顺便设置一下标签的字体就够了。 【参考方案1】:

您得到的例外是因为您尝试设置UILabel属性(这是setValue:forKeypath: 正在做的事情)。由于您将字符串 fontName 作为键路径传递,ios 会尝试将属性 fontNameUILabel 设置为值 NavBar Title。这就是您得到异常的原因,因为UILabel 没有名为fontName 的属性!拨打[label setFont:[UIFont fontWithName:@"Pennyscript" size:20]]; 就够了!

【讨论】:

抱歉这不对...我删除了“用户定义的键属性”并修复了崩溃...我将更新代码。它仍然是虽然不工作..我必须以某种方式给 UILabel UDKA..但以编程方式。 相信我,设置自定义字体与用户定义的运行时属性无关!查看文档:developer.apple.com/library/ios/documentation/uikit/reference/… 只是将系统字体设置为较小的大小是否有效?是否进行了更改?您需要采取一些小步骤并开始进一步调试您的问题。例如:[navTitleLabel setFont:[UIFont systemFontOfSize:14]];。这行得通吗?你的字体越来越小了?如果不是,您知道您的问题不是因为字体,而是因为标签设置不正确。 哦哇... 可悲的是,问题是我从来没有设置 UILabel 的文本.. 哈哈。它完全有效......不需要用户定义的键属性 [navTitleLabel setFont:[UIFont fontWithName:@"Pennyscript" size:20]];设置字体后用NSLog(@"Font: %@", navTitleLabel.font);打印出navTitleLabel 的字体会发生什么,它真的告诉你字体设置正确了吗?跨度> 【参考方案2】:

在你的视图控制器中定义一个属性为:

@property (nonatomic, copy) NSString *myFontName;

在视图控制器中,身份检查器将 Keypath 从 fontName 更改为 myFontName

并更改此代码:

[navTitleLabel setFont:[UIFont fontWithName:@"Pennyscript" size:20]];

到:

[navTitleLabel setFont:[UIFont fontWithName:myFontName size:20]];

教程:

    Reference Reference Reference Reference

【讨论】:

【参考方案3】:

在项目文件中复制字体。添加项目然后添加 info.plist

然后把这个方法

UILabel *navTitleLabel = [[UILabel 分配] initWithFrame:CGRectMake(17, 0, 100, 100)];

navTitleLabel.backgroundColor = [UIColor clearColor];
navTitleLabel.textAlignment = NSTextAlignmentCenter;
navTitleLabel.text = @"hello";
 navTitleLabel.font = [UIFont fontWithName:@"Pennyscript" size:navTitleLabel.font.pointSize];
self.navigationItem.titleView = navTitleLabel;

【讨论】:

以上是关于以编程方式将 UILabel 字体设置为用户定义的运行时属性的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将字体自定义字体设置为 Spinner 文本?

以编程方式将所有 UILabel 设置为子类

如何以编程方式将控制台字体设置为 Lucida?

调整 UILabel 字体大小以适合文本

你在哪里以编程方式在 UIView 中为 UILabel 设置文本?

UILabel 最小字体大小阴影问题