iPhone SDK 3.2和UIAppFonts

iPhone SDK 3.2和UIAppFonts,iphone,iphone-sdk-3.2,uifont,Iphone,Iphone Sdk 3.2,Uifont,我已经将我的自定义字体添加到UIAppFonts中,并且加载得很好:(显示在[UIFont familyNames]中)。当我在视图中手动设置字体时,加载{[myLabel setFont:[UIFontWithName:@“CustomFont”size:65.0]];}一切正常,字体呈现 然而,在IB中做同样的事情并没有(而是使用其他一些默认字体)。必须为每个标签创建IBOutlets,并在viewDidLoad中手动修复字体,这是非常痛苦的 其他人在使用3.2 SDK和IB获得自定义字体支

我已经将我的自定义字体添加到UIAppFonts中,并且加载得很好:(显示在
[UIFont familyNames]
中)。当我在
视图中手动设置字体时,加载{[myLabel setFont:[UIFontWithName:@“CustomFont”size:65.0]];}
一切正常,字体呈现

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


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

在苹果公司打开了一个bug报告,结果发现它确实是一个bug。我最终使用的解决方法是:

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

在我们的网站上写了一篇长一点的帖子。

也有类似的问题。并用这种方式解决了它

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

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

希望它能起作用

如果您不想创建子类,这个解决方案对我来说又快又脏。当然,它假设所有标签都有相同的字体,在我的例子中就是这样

for (UIView *v in view.subviews) {

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

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

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

将字体添加到Info.plist中的UIAppFonts属性不会导致它们被加载吗?你在这里的这个小技巧让我非常高兴:)有了它,我可以在瞄准iOS<3.2时轻松使用自定义字体。它使用的是私有框架吗?这些值是什么RTLD|u NOLOAD | RTLD|u LAZY???@prajakta…很抱歉回复太晚…最好在使用上述解决方案时查看一下,它是有效的,但由于某些原因,所有自定义标签都不会在标签中垂直居中文本-而是将文本捕捉到顶部。你注意到了吗?它的作用是抵消我所有的标签,使其看起来不协调。作为对我自己上述评论的回应,我通过在设置新字体之前检查self.font.ascender,然后在设置字体后通过差异抵消整个标签来“修复”问题,而不是更改每种字体。仅为要更改的标签设置UIView.tag,然后在此循环中检查它是否也有效