Objective c 目标C-使用类别更改系统字体
我想更改所有UITextViews的默认字体。似乎最简单的方法是通过自定义类别。我找到了这个解决方案:并尝试实施它 但是我的UITextView是以编程方式添加的,因此不会调用awakeFromNib函数。我尝试将其移动到initWithFrame,如下所示:Objective c 目标C-使用类别更改系统字体,objective-c,uitextview,autolayout,Objective C,Uitextview,Autolayout,我想更改所有UITextViews的默认字体。似乎最简单的方法是通过自定义类别。我找到了这个解决方案:并尝试实施它 但是我的UITextView是以编程方式添加的,因此不会调用awakeFromNib函数。我尝试将其移动到initWithFrame,如下所示: -(id)initWithFrame:(CGRect)frame { id result = [super initWithFrame:frame]; if (result) { float size =
-(id)initWithFrame:(CGRect)frame
{
id result = [super initWithFrame:frame];
if (result) {
float size = [self.font pointSize];
NSString *stringfontstyle=self.font.fontName;
if([stringfontstyle rangeOfString:@"Bold"].location != NSNotFound) {
self.font = [UIFont fontWithName:@"Avenir-Black" size:size];
}
else if ([stringfontstyle rangeOfString:@"Italic"].location != NSNotFound) {
self.font = [UIFont fontWithName:@"Avenir-Oblique" size:size];
}
else if ([stringfontstyle rangeOfString:@"Medium"].location != NSNotFound) {
self.font = [UIFont fontWithName:@"Avenir-Medium" size:size];
}
else {
self.font = [UIFont fontWithName:@"Avenir-Roman" size:size];
}
}
return result;
}
奇怪的是,如果我的类别包含initWithFrame函数,UITextView就会消失。我错过了什么
注意:我使用的是autoLayout,因此使用CGRectZero调用initWithFrame,但我认为这不是问题所在
编辑:
问题是启动UITextView时字体为空。那么什么方法适合将代码放入其中呢?当类别包含一个方法时,它会覆盖类的方法。。。这不好。子类化将起作用。。方法swizzling可能是一种方法,但是 为什么不直接将UITextView子类化呢?这样,您就可以将initWithFrame保持为thingy,或者覆盖字体
- (UIFont*)font {
if(!myFont) {
_myFont = xy;
}
id superFont = super.font;
if(![superFont.name isEqualTo:_myFont.name]) {
super.font = [myFont fontWithSize:superFont.pointSize];
}
return _myFont;
}
或设置字体:
- (void)setFont:(UIFont*)newFont {
if(!myFont) {
_myFont = xy;
}
id thisFont = [_myFont fontWithSize:newFont.pointSize];
super.font = thisFont;
您似乎混淆了子类化和类别。考虑一下你所发布的代码中的<代码>超级< /代码>。我很确定您不能使用类别重写方法。因此,我应该创建一个UITextView子类,并从外观上重写setFont函数?@特洛伊木马()您可以使用类别覆盖方法,但这是不鼓励的。UIAppearance很好,但我想它不可能与大小类之类的内容合并,对吗?当然,您也可以更改setFont;)写出来可能更好:谢谢你的帮助。我已经重写了setFont方法,它工作得很好。