有时候为了统一界面中所有的Label,Button,UITextField等的字体,我们在初始化的时候就需要不断的添加冗余的代码来设置自己的字体。
UILabel *label = [[UILabel alloc] init];
label.font = [UIFont fontWithName:@"myFont"];
如果你的界面全部都是代码实现的。而且项目初期就已经定下统一用什么字体了,这就不是什么难事。但是,如果你的界面是由大量IB实现的,而且用的是自定义的字体,在IB中选都没法选,或是项目已经完成的差不多了,上面要求统一改字体,那该如何是好?
现在就来看通过Objective-C的动态性来设置统一的字体。
Method swizzling
什么是Method swizzling,请查看文章最后关联的链接。
注意:以下方法只用于全局修改由Xib加载的界面的UIButton,UIlabel的字体,其他的如UITextField等类似,新建Catogery就好,想修改代码生成的界面,修改initWithCoder为init就好
#import <UIKit/UIKit.h>
#import <objc/runtime.h>
@interface UIButton (myFont) @end
@interface UILabel (myFont)@end
@implementation UIButton (myFont)
+ (void) load
{
Method imp = class_getInstanceMethod([self class],@selector(initWithCoder:));
Method myImp = class_getInstanceMethod([self class],@selector(myInitWithCoder:));
method_exchangeImplementations(imp,myImp);
}
- (id) myInitWithCoder:(NSCoder *)aDecode
{
[self myInitWithCoder:aDecode];
if (self) {
CGFloat fontSize = self.titleLabel.font.pointSize;
self.titleLabel.font = <# Your Font Here #>;
}
return self;
}
@implementation UILabel (myFont)
+ (void) load
{
Method imp = class_getInstanceMethod([self class], @selector(initWithCoder:));
Method myImp = class_getInstanceMethod([self class], @selector(myInitWithCoder:));
method_exchangeImplementations(imp, myImp);
}
- (id)myInitWithCoder:(NSCoder*)aDecode
{
[self myInitWithCoder:aDecode];
if (self) {
CGFloat fontSize = self.font.pointSize;
self.font = <# Your Font Here #>;
}
return self;
}
@end
网友评论