__NSPlaceholderDictionary 覆盖 UIFonts 时崩溃
__NSPlaceholderDictionary crash when overriding UIFonts
我正在使用以下代码覆盖我的应用程序中的所有字体。我花了好几个小时才弄明白,但随着字体被覆盖,正常功能会中断(例如:UITableViewCell
上的长按手势),并且 UIBarButtonItem
的所有实例都被截断,仅显示 ...
在导航栏中。
崩溃总是导致
* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
//.h
@interface UIFont (SystemFontOverride)
@end
//.m
@implementation UIFont (SystemFontOverride)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize {
return [UIFont fontWithName:@"HelveticaNeue-Regular" size:fontSize];
}
+ (UIFont *)systemFontOfSize:(CGFloat)fontSize {
return [UIFont fontWithName:@"HelveticaNeue-Thin" size:fontSize];
}
+ (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize {
return [UIFont fontWithName:@"HelveticaNeue-ThinItalic" size:fontSize];
}
#pragma clang diagnostic pop
@end
我做错了什么吗?有没有更好的方法来覆盖字体而无需手动设置每个标签、段控制等...此应用程序不会出现在应用程序商店中,因此我愿意接受任何建议。
奖金问题,#pragma clang diagnostic pop
和 #pragma clang diagnostic push
。我理解它保存编译器的状态,消除警告,然后恢复状态。我可以只用 #pragma clang diagnostic ignored
吗?
您还可以子类化 UILabel 并在任何地方使用它:
例如在init方法中调用setFont,
然后简单地用您的子类查找并替换 UILabel
为了将此标记为已回答,我正在关注 rmaddy 的评论
Instead of trying to replace the standard UIFont methods in a category, add your own methods to the category. Example - instead of overriding boldSystemFontOfSize:, name it myBoldSystemFontOfSize:. Or use UI_APPEARANCE or change a label's font size using label.font = [label.font fontWithSize:newSize];
我走了 UI_APPEARANCE
路线
[[UILabel appearance] setFont:[UIFont fontWithName:fontName size:fontSize]];
如果你的标签需要不同的字体大小,这可能会有问题,幸运的是,我需要更改的标签都是相同的字体大小
我正在使用以下代码覆盖我的应用程序中的所有字体。我花了好几个小时才弄明白,但随着字体被覆盖,正常功能会中断(例如:UITableViewCell
上的长按手势),并且 UIBarButtonItem
的所有实例都被截断,仅显示 ...
在导航栏中。
崩溃总是导致
* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
//.h
@interface UIFont (SystemFontOverride)
@end
//.m
@implementation UIFont (SystemFontOverride)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize {
return [UIFont fontWithName:@"HelveticaNeue-Regular" size:fontSize];
}
+ (UIFont *)systemFontOfSize:(CGFloat)fontSize {
return [UIFont fontWithName:@"HelveticaNeue-Thin" size:fontSize];
}
+ (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize {
return [UIFont fontWithName:@"HelveticaNeue-ThinItalic" size:fontSize];
}
#pragma clang diagnostic pop
@end
我做错了什么吗?有没有更好的方法来覆盖字体而无需手动设置每个标签、段控制等...此应用程序不会出现在应用程序商店中,因此我愿意接受任何建议。
奖金问题,#pragma clang diagnostic pop
和 #pragma clang diagnostic push
。我理解它保存编译器的状态,消除警告,然后恢复状态。我可以只用 #pragma clang diagnostic ignored
吗?
您还可以子类化 UILabel 并在任何地方使用它:
例如在init方法中调用setFont,
然后简单地用您的子类查找并替换 UILabel
为了将此标记为已回答,我正在关注 rmaddy 的评论
Instead of trying to replace the standard UIFont methods in a category, add your own methods to the category. Example - instead of overriding boldSystemFontOfSize:, name it myBoldSystemFontOfSize:. Or use UI_APPEARANCE or change a label's font size using label.font = [label.font fontWithSize:newSize];
我走了 UI_APPEARANCE
路线
[[UILabel appearance] setFont:[UIFont fontWithName:fontName size:fontSize]];
如果你的标签需要不同的字体大小,这可能会有问题,幸运的是,我需要更改的标签都是相同的字体大小