以编程方式将 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 会尝试将属性 fontName
的 UILabel
设置为值 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 文本?