我想更改所有 UITextViews 的默认字体。似乎最简单的方法是通过自定义类别。我找到了这个解决方案:Change the default systemFont used by controls并试图实现它。
但我的UITextViews是以编程方式添加的,因此不会调用awakeFromNib函数。我尝试将它移动到initWithFrame,如下所示:
-(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时字体为空。那么将代码置于什么方法是合适的?
答案 0 :(得分:1)
当category包含一个方法时,它会覆盖该类的方法......这并不好。子类化可以工作..方法混合可能是一种方式,但......
你为什么不只是UITextView的子类 - 然后你可以保持你的initWithFrame东西或者可能覆盖字体
- (UIFont*)font {
if(!myFont) {
_myFont = xy;
}
id superFont = super.font;
if(![superFont.name isEqualTo:_myFont.name]) {
super.font = [myFont fontWithSize:superFont.pointSize];
}
return _myFont;
}
或setFont:
- (void)setFont:(UIFont*)newFont {
if(!myFont) {
_myFont = xy;
}
id thisFont = [_myFont fontWithSize:newFont.pointSize];
super.font = thisFont;