IPhone SDK 3.2 и UIAppFonts
Я добавил свой пользовательский шрифт в UIAppFonts, и он загрузился просто отлично: (отображается в [UIFont familyNames]
). Когда я вручную устанавливаю шрифт в viewDidLoad { [myLabel setFont: [UIFont fontWithName:@"CustomFont" size: 65.0]]; }
, все работает, а шрифт визуализируется.
Однако делать то же самое в IB нет (вместо этого используется другой шрифт по умолчанию). При создании IBOutlets для каждой метки и исправления шрифтов вручную в viewDidLoad довольно болезненно.
У кого-нибудь были проблемы с получением поддержки пользовательских шрифтов для работы с 3.2 SDK и IB?
Ответы
Ответ 1
Открыл отчет об ошибке с 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
Написал немного более длинную запись в нашем blog.
Ответ 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;
}
Надеюсь, что это сработает.
Ответ 3
Если вы не хотите иметь подкласс, это решение работало быстро и грязно для меня. Конечно, предполагается, что все метки имеют один и тот же шрифт, и в моем случае это было так.
for (UIView *v in view.subviews) {
if ([v isKindOfClass:[UILabel class]]) {
UILabel *label = (UILabel*)v;
[label setFont:[UIFont fontWithName:@"Quake" size:label.font.pointSize]];
}
}
Я помещаю это в класс-помощник и просто вызываю его, передавая свое текущее представление.