Objective c 目标C-使用类别更改系统字体

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 =

我想更改所有UITextViews的默认字体。似乎最简单的方法是通过自定义类别。我找到了这个解决方案:并尝试实施它

但是我的UITextView是以编程方式添加的,因此不会调用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时字体为空。那么什么方法适合将代码放入其中呢?

当类别包含一个方法时,它会覆盖类的方法。。。这不好。子类化将起作用。。方法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方法,它工作得很好。