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

时间:2014-09-10 19:34:42

标签: ios objective-c xcode ios8 xcode6

我目前正在使用Xcode 6预发行版(非测试版)和OS X 10.10 Yosemite beta 7上的模拟器。我正在尝试构建一个在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方法之后发生了错误(因此在执行了所有代码之后)。

任何想法?我项目中所有内容的字体都是'Baskerville',我尝试过改变它,但它不会影响崩溃。

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

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

8 个答案:

答案 0 :(得分:23)

此问题已在iOS 8.1中修复。

我没有花时间构建自定义页眉/页脚视图,我只是不将自定义字体应用于运行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];
}

如果设备运行的iOS版本低于8(因为iOS 8.0中引入了isOperatingSystemAtLeastVersion:),则第一条语句为真。如果设备运行iOS 8.1或更高版本,则第二个语句为真。因此,对于这两个语句,我们只排除运行iOS 8.0的设备。

答案 1 :(得分:4)

好的,我终于明白了。

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

尽管如此,这绝对是iOS 8中的一个错误,希望很快就会修复。

答案 2 :(得分:3)

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

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

替换此行:

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

为此:

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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

终于找到了解决方法。这很简单,你只需要在其他方向构建字体:)

// 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]

答案 5 :(得分:1)

此问题仍然存在于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]];
}

答案 6 :(得分:0)

当使用UITableView或UITableViewController时initWithStyle:方法调用设置为UITableViewStyleGrouped时,这种情况才会发生。将样式更改为UITableViewStylePlain可解决问题。

答案 7 :(得分:0)

同样的问题:在我的app init中为UITableViewHeaderFooterView设置自定义字体,在显示分组的UITableView时出现此问题。

对我来说有用的是延迟自定义直到创建视图控制器,即在视图控制器的init中执行你在app init处所做的任何事情。刺激,但对我有用。

- (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];

    ...
  }
}