scaledValueForValue:调用没有文本样式集的字体

我目前正在使用的Xcode 6前版本(而不是testing版)和OS X 10.10 Yosemite beta 7上的模拟器。我试图build立一个项目在Xcode 6开发,但应用程序崩溃,每当我打开一个特定的视图控制器。 这个视图控制器从字面上没有代码(它是一个空的,静态的,表视图控制器,有几个默认的单元格和标签)。

给出的错误是:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'scaledValueForValue: called on a font that doesn't have a text style set' 

而在我得到这个断言失败之前:

 *** Assertion failure in -[UICTFont _scaledValueForValue:], /SourceCache/UIFoundation_Sim/UIFoundation-371/UIFoundation/iOS/UIFont.m:496 

我真的不知道发生了什么,我尝试在VC中设置断点,但是在调用viewDidLoad方法(因此在执行完所有代码之后)之后发生错误。

有任何想法吗? 在我的项目中的一切字体是'巴斯克维尔',我试图改变,但它不影响崩溃。

哦,如果我使用Xcode 5,它工作正常。

更新9/24 :所以我仍然无法弄清楚这一点。 我尝试使用fontWithDescriptor方法,但它仍然崩溃。 有趣的是,我有很多使用自定义字体的页面,而且大多数页面都可以正常工作,但是有两个VC会在我去他们的时候立即崩溃…其中一个甚至没有任何自定义字体。 我非常感谢您的反馈,但是有没有人有任何其他想法/修复? 我正在使用Xcode的正式版本,它仍然无法正常工作。

这个问题已经在iOS 8.1中解决了。

而不是花费时间build立一个自定义的页眉/页脚视图,我只是不应用自定义字体到运行iOS 8.0的设备。 无论如何,大多数人可能已经更新到iOS 8.1。

我使用下面的代码:

 NSOperatingSystemVersion iOS_8_1 = (NSOperatingSystemVersion){8, 1, 0}; if (![[NSProcessInfo processInfo] respondsToSelector:@selector(isOperatingSystemAtLeastVersion:)] || [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:iOS_8_1]) { header.textLabel.font = [UIFont fontWithName:@"Avenir-Medium" size:header.textLabel.font.pointSize]; } 

如果设备运行的是低于8的iOS版本(因为isOperatingSystemAtLeastVersion:在iOS 8.0中引入),所以第一条语句是正确的。 如果设备运行的是iOS 8.1或更高版本,则第二种说法是正确的。 有了这两个声明,我们只能排除运行iOS 8.0的设备。

好吧,我终于明白了。

这发生在分组表格视图具有节标题和可能的页脚时。 作为一个临时的解决方法,我只是从分组的tableviews中删除页眉/页脚,但如果你真的需要字体,你可以通过覆盖“viewForHeaderInSection”,并在你的自定义视图的标签上设置字体来创build自定义页眉视图。

不过,这绝对是iOS 8中的一个错误,希望很快就会解决。

像所有人一样,在其他答案中应用修复导致字体设置被忽略。 我最终做的是有我自己的UITableViewHeaderFooterView(这似乎是崩溃的原因来自)有一个标签,我添加自己的子类。 然后,我用这个标签,而不是从UITableViewHeaderFooterViewinheritance的textLabel属性,设置自动布局约束,设置字体,一切都是正确的一次(虽然不是我认为理想)。 我会再次补充说,这似乎是独一无二的iOS 8。

看看: http : //openradar.io/17623734

不幸的是,在xCode 6的早期阶段,我只能提供解决方法。

replace这一行:

 [header.textLabel setFont:[UIFont fontWithName:@"HelveticaNeue-Bold" size:17]]; 

为了这:

 header.textLabel.font = [UIFont fontWithDescriptor:[UIFontDescriptor fontDescriptorWithFontAttributes:@{@"NSCTFontUIUsageAttribute" : UIFontTextStyleBody, @"NSFontNameAttribute" : @"HelveticaNeue-Italic"}] size:17.0]; 

最后find解决方法。 这很简单,你只需要在其他方向上构build字体:)

 // 1. Grab your custom font CGFloat size = 17.0f; UIFont *font = [UIFont fontWithName:@"Brandon Grotesque" size:size]; // 2. Get descriptor for your font and create new descriptor with UIFontDescriptorTextStyleAttribute and UIFontDescriptorSizeAttribute attributes from it. UIFontDescriptor *des = [[font fontDescriptor] fontDescriptorByAddingAttributes:@{ UIFontDescriptorTextStyleAttribute: UIFontTextStyleBody, // You can tune this style based on usage UIFontDescriptorSizeAttribute: @(size) }]; // 3. Get your font UIFont *finalFont = [UIFont fontWithDescriptor:des size:0.0] 

这个问题在iOS 8.0.2中仍然存在,但似乎在8.1中得到了修复。

我的解决方法是仅在iOS大于8.0.2时设置自定义字体:

 #define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending) ... if (SYSTEM_VERSION_GREATER_THAN(@"8.0.2")) { [[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setFont:[UIFont fontWithName:@"Helvetica" size:14.0]]; } 

这只适用于使用UITableView或UITableViewController的地方,其中initWithStyle:方法调用设置为UITableViewStyleGrouped 。 将样式更改为UITableViewStylePlain解决了这些问题。

同样的问题在这里:在我的应用程序init中为UITableViewHeaderFooterView设置自定义字体,当显示分组的UITableView时得到这个崩溃。

什么对我来说是延迟定制直到视图控制器正在创build,即做任何你会在视图控制器的初始化在应用程序初始化完成。 刺激,但为我工作。

 - (id) init { ... if (self = [super init]) { // customise table view headers UILabel *headerLabel = [UILabel appearanceWhenContainedIn: [UITableViewHeaderFooterView class], nil]; headerLabel.font = [UIFont fontWithName: @"AvenirNext-Medium" size: 15]; ... } }