Objective C - 用类别更改系统字体

时间:2014-09-18 14:01:01

标签: objective-c uitextview autolayout

我想更改所有 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时字体为空。那么将代码置于什么方法是合适的?

1 个答案:

答案 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;