8

我已将我的自定义字体添加到 UIAppFonts 并且加载得很好:(显示在 中[UIFont familyNames])。viewDidLoad { [myLabel setFont: [UIFont fontWithName:@"CustomFont" size: 65.0]]; } 当我在一切工作中手动设置字体并渲染字体时。

然而,在 IB 中做同样的事情不会(使用其他一些默认字体)。必须为每个标签创建 IBOutlets 并在 viewDidLoad 中手动修复字体是非常痛苦的。

其他人在获得自定义字体支持以使用 3.2 SDK 和 IB 时遇到问题吗?

4

3 回答 3

2

打开与 Apple 的错误报告,结果发现它确实是一个错误。我最终使用的解决方法是:

// LabelQuake.h
@interface LabelQuake : UILabel
@end

// LabelQuake.m
@implementation LabelQuake

    - (id)initWithCoder:(NSCoder *)decoder {
        if (self = [super initWithCoder: decoder]) {
            [self setFont: [UIFont fontWithName: @"Quake" size: self.font.pointSize]];
        }

        return self;
    }
@end

在我们的博客上写了更长的帖子。

于 2010-05-19T08:57:20.200 回答
2

有类似的问题。并以这种方式修复它......

将我的自定义字体添加到我的资源组。然后通过下面给出的代码加载所有字体:

- (NSUInteger) loadFonts{
NSUInteger newFontCount = 0;
NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
if (frameworkPath) {
    void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
    if (graphicsServices) {
        BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
        if (GSFontAddFromFile)
            for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
                newFontCount += GSFontAddFromFile([fontFile UTF8String]);
    }
}

return newFontCount;}


 - (id)initWithCoder:(NSCoder *)decoder {
    //load the fonts
    [self loadFonts];

    if (self = [super initWithCoder: decoder]) {
        [self setFont: [UIFont fontWithName: @"Quake" size: self.font.pointSize]];
    }

    return self;
}

希望它会奏效。

于 2010-06-08T07:28:45.420 回答
1

如果您不想进行子类化,那么这个解决方案对我来说工作得又快又脏。当然,它假设所有标签都具有相同的字体,在我的情况下就是这种情况。

for (UIView *v in view.subviews) {

    if ([v isKindOfClass:[UILabel class]]) {
      UILabel *label = (UILabel*)v;

      [label setFont:[UIFont fontWithName:@"Quake" size:label.font.pointSize]];
    }
}

我把它放在一个助手类中,然后调用它,传入我当前的视图。

于 2011-01-05T09:06:12.953 回答