有没有办法在iPhone Objective-C中将全局字体[新自定义字体]应用于整个应用程序。
我知道我们可以使用以下方法为每个标签设置字体:
[self.titleLabel setFont:[UIFont fontWithName:@"FONOT_NAME" size:FONT_SIZE]];
但是我希望对整个应用进行更改。如果有人知道,请帮忙。
有没有办法在iPhone Objective-C中将全局字体[新自定义字体]应用于整个应用程序。
我知道我们可以使用以下方法为每个标签设置字体:
[self.titleLabel setFont:[UIFont fontWithName:@"FONOT_NAME" size:FONT_SIZE]];
显然,要同时更改所有的UILabel,你需要在UILabel上设置一个类别并更改默认字体。所以这里有一个解决方案:
创建一个名为CustomFontLabel.h的文件。
@interface UILabel(changeFont)
- (void)awakeFromNib;
-(id)initWithFrame:(CGRect)frame;
@end
@implementation UILabel(changeFont)
- (void)awakeFromNib
{
[super awakeFromNib];
[self setFont:[UIFont fontWithName:@"Zapfino" size:12.0]];
}
-(id)initWithFrame:(CGRect)frame
{
id result = [super initWithFrame:frame];
if (result) {
[self setFont:[UIFont fontWithName:@"Zapfino" size:12.0]];
}
return result;
}
@end
#import "CustomFontLabel.h"
这就是全部内容 - 祝你好运
awakeFromNib
和 initWithFrame
的标准实现,如果Apple在这里添加了一些重要的代码怎么办? - zoulUILabel
类的标准方法。问题在于没有合理的方式来调用你已经替换的代码——在类别中调用super
不会调用你已经覆盖的代码。现在,[UILabel awakeFromNib]
的标准实现似乎并没有做任何重要的事情,所以这个“解决方案”现在可以工作。但是这可能会在任何小更新中改变,导致你的应用程序崩溃。 - zoul请注意,覆盖……如果在类别中声明的方法名称与原始类中的方法名称相同或与同一类别中(甚至是超类)的另一个方法名称相同,则无法确定在运行时使用哪个方法实现。……
-(id) init;
比覆盖-(id)initWithFrame:(CGRect)frame
更安全。这样,您就不会面临在单击UIButton上的标签时无法接收到触摸事件的问题。这是你的意思吗?
@interface GlobalMethods
+(UIFont *)appFont;
@end
@implementation GlobalMethods
+(UIFont *)appFont{
return [UIFont fontWithName:@"someFontName" size:someFontSize];
}
@end
...
[self.titleLabel setFont:[GlobalMethods appFont]];
如果你想以某种自动化的方式来处理它(而不是在每个控件上使用setFont
),我不认为这是可能的。
CustomLabel.h
#import <UIKit/UIKit.h>
@interface VVLabel : UILabel
@end
CustomLabel.m
#import "CustomLabel.h"
#define FontDefaultName @"YourFontName"
@implementation VVLabel
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder: aDecoder];
if (self) {
// Initialization code
// Static font size
self.font = [UIFont fontWithName:FontDefaultName size:17];
// If you want dynamic font size (Get font size from storyboard / From XIB then put below line)
self.font = [UIFont fontWithName:FontDefaultName size:self.font.pointSize];
}
return self;
}