Iphone Xcode:如何在应用程序中一次更改所有字体?

Iphone Xcode:如何在应用程序中一次更改所有字体?,iphone,objective-c,xcode4,Iphone,Objective C,Xcode4,我想知道是否有可能同时更改大约100个不同ViewController上的字体?这将比一个接一个地经历并改变它们要困难得多。有什么想法吗?谢谢大家! 用户界面文件(*.xib)为纯文本,您可以将其加载到编辑器中 在左侧窗格的Xcode4中,您可以右键单击>打开为>源代码 这将为您提供可以在那里找到/替换的任何XML源 警告:出错可能导致整个文件无效,因此,除非您有源代码管理,否则请在尝试更改之前复制XIB。您不能一次更改所有字体 但我发现还有一种可以帮助你 我已经做了一些递归函数,你可以帮你 按

我想知道是否有可能同时更改大约100个不同ViewController上的字体?这将比一个接一个地经历并改变它们要困难得多。有什么想法吗?谢谢大家!

用户界面文件(*.xib)为纯文本,您可以将其加载到编辑器中

在左侧窗格的Xcode4中,您可以右键单击>打开为>源代码

这将为您提供可以在那里找到/替换的任何XML源


警告:出错可能导致整个文件无效,因此,除非您有源代码管理,否则请在尝试更改之前复制XIB。

您不能一次更改所有字体

但我发现还有一种可以帮助你

我已经做了一些递归函数,你可以帮你

按照以下步骤操作

首先创建一个类(
BaseViewController
),该类是从
UIViewController
扩展而来的,类似于
BaseViewController.h
文件

@interface BaseViewController : UIViewController
并在
BaseViewController.m
文件中编写以下代码。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self changeFontsOfViewController];
}

-(void)changeFontsOfViewController
{
    UIViewController * vv = [self viewControllerOfView:self.view];
    NSArray *objects = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([vv class]) owner:vv options:nil];

    for (id object in objects)
    {
        [self changeFontOfView:object];
    }

}

-(void)changeFontOfView:(UIView *)aView
{
    for (UIView *vv in [aView subviews])
    {

        if ([vv isKindOfClass:[UIButton class]])
        {
            UIButton *btn = (UIButton *)vv;
            CGFloat fontSize = btn.titleLabel.font.pointSize;
            btn.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:fontSize];
        }
        else if ([vv isKindOfClass:[UILabel class]])
        {
            UILabel *lbl = (UILabel *)vv;
            CGFloat fontSize = lbl.font.pointSize;
            [lbl setFont:[UIFont fontWithName:@"Helvetica-Bold" size:fontSize]];
        }
        else if ([vv isKindOfClass:[UITextView class]])
        {
            UITextView *txt = (UITextView *)vv;
            CGFloat fontSize = txt.font.pointSize;
            [txt setFont:[UIFont fontWithName:@"Helvetica-Bold" size:fontSize]];
        }
        else if ([vv isKindOfClass:[UITextField class]])
        {
            UITextField *txt = (UITextField *)vv;
            CGFloat fontSize = txt.font.pointSize;
            [txt setFont:[UIFont fontWithName:@"Helvetica-Bold" size:fontSize]];
        }
        else if ([vv isKindOfClass:[UIView class]]||[vv isKindOfClass:[UIScrollView class]])
        {
            if (aView.subviews.count == 0)return;
            [self changeFontOfView:vv];
        }
    }

}
#import "BaseViewController.h"

@interface RootViewController : BaseViewController
{

}
现在,您的每个viewController(RootViewController)都将从BaseViewController类扩展,如
RootViewController.h

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self changeFontsOfViewController];
}

-(void)changeFontsOfViewController
{
    UIViewController * vv = [self viewControllerOfView:self.view];
    NSArray *objects = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([vv class]) owner:vv options:nil];

    for (id object in objects)
    {
        [self changeFontOfView:object];
    }

}

-(void)changeFontOfView:(UIView *)aView
{
    for (UIView *vv in [aView subviews])
    {

        if ([vv isKindOfClass:[UIButton class]])
        {
            UIButton *btn = (UIButton *)vv;
            CGFloat fontSize = btn.titleLabel.font.pointSize;
            btn.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:fontSize];
        }
        else if ([vv isKindOfClass:[UILabel class]])
        {
            UILabel *lbl = (UILabel *)vv;
            CGFloat fontSize = lbl.font.pointSize;
            [lbl setFont:[UIFont fontWithName:@"Helvetica-Bold" size:fontSize]];
        }
        else if ([vv isKindOfClass:[UITextView class]])
        {
            UITextView *txt = (UITextView *)vv;
            CGFloat fontSize = txt.font.pointSize;
            [txt setFont:[UIFont fontWithName:@"Helvetica-Bold" size:fontSize]];
        }
        else if ([vv isKindOfClass:[UITextField class]])
        {
            UITextField *txt = (UITextField *)vv;
            CGFloat fontSize = txt.font.pointSize;
            [txt setFont:[UIFont fontWithName:@"Helvetica-Bold" size:fontSize]];
        }
        else if ([vv isKindOfClass:[UIView class]]||[vv isKindOfClass:[UIScrollView class]])
        {
            if (aView.subviews.count == 0)return;
            [self changeFontOfView:vv];
        }
    }

}
#import "BaseViewController.h"

@interface RootViewController : BaseViewController
{

}
并确保在
UIViewController
RootViewController.m
)的
.m
文件中写入了以下内容


请小心地按照上面的步骤操作,你会发现……

UIView上的这个小递归方法怎么样

@implementation UIView (JPCSetFont)

- (void)jpc_setAllFonts:(UIFont *)font
{
    if ([self respondsToSelector:@selector(setFont:)]) {
        UIFont *oldFont = [self valueForKey:@"font"];
        UIFont *newFont = [font fontWithSize:oldFont.pointSize];
        [self setValue:newFont forKey:@"font"];
    }

    for (UIView *subview in self.subviews) {
        [subview jpc_setAllFonts:font];
    }
}

@end

约翰·克罗马蒂的代码是个好东西。简单简洁

请记住,有些字体是粗体或斜体。因此,您可能必须传递2(或3)个参数:对于常规字体(现在是这样),对于粗体字体和斜体字体。此外,您还必须检测当前字体是否为粗体等,因此下面有一段增强的代码

然而,它在iOS7上可能会出错,因为用户可以设置自己的字体,因此重量/样式检测无法正常工作

@implementation UIView (JPCSetFont)

- (void)jpc_setAllFonts:(UIFont*)regular bold:(UIFont*)bold
{
    if ([self respondsToSelector:@selector(setFont:)]) {
        UIFont *oldFont = [self valueForKey:@"font"];

        UIFont *newFont;
        // for iOS6
        NSRange isBold = [[oldFont fontName] rangeOfString:@"Bold" options:NSCaseInsensitiveSearch];
        // for iOS7 (is device owner didn't change it!)
        NSRange isMedium = [[oldFont fontName] rangeOfString:@"MediumP4" options:NSCaseInsensitiveSearch];
        if (isBold.location==NSNotFound && isMedium.location==NSNotFound) {
            newFont = [regular fontWithSize:oldFont.pointSize];
        } else {
            newFont = [bold fontWithSize:oldFont.pointSize];
        }

        // TODO: there are italic fonts also though

        [self setValue:newFont forKey:@"font"];
    }

    for (UIView *subview in self.subviews) {
        [subview jpc_setAllFonts:regular bold:bold];
    }
}

@end

使用
sed
批量修改源代码。请参阅我的答案,了解更简单的递归方法。谢谢,我已将其集成到我的代码中,但它将如何与自动布局一起工作?请看我的问题你解决了我的问题。有超过20个视图。。。一个替代品把它们都修好了#上帝模式