我想知道是否可以同时更改大约100个不同的viewcontrollers上的字体?与逐个完成并改变它们相比,它会更加顺畅。有任何想法吗?谢谢!
答案 0 :(得分:9)
用户界面文件(* .xib)是纯文本,您可以将它们加载到编辑器中。
在左侧窗格的Xcode4中,您可以右键单击>打开>源。
这将为您提供任何可以在那里找到/替换的XML源代码。
警告:做错了可能会导致整个文件无效,所以除非你有源控制,否则在尝试更改之前复制XIB。
答案 1 :(得分:3)
你不能一次改变所有字体....
但是我找到了一个可以帮助你的变量...
我已经做了一些递归功能,你可以帮助你..
按照以下步骤进行..
首先创建一个从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];
}
}
}
现在你的每个viewController(RootViewController)将从RootViewController.h
中的BaseViewController类扩展..
#import "BaseViewController.h"
@interface RootViewController : BaseViewController
{
}
并确保您在.m
UIViewController
<{1>}
RootViewController.m
文件中写了以下内容
- (void)viewDidLoad
{
[super viewDidLoad];
}
请仔细按照上述步骤进行摇滚.......
答案 2 :(得分:2)
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
答案 3 :(得分:0)
John Cromartie的代码很好。简单而简洁。
请记住,某些字体是粗体或斜体。所以你可能需要传递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
https://github.com/iutinvg/ZZLib/blob/master/ZZLib/UIView%2BZZFontSetter.h https://github.com/iutinvg/ZZLib/blob/master/ZZLib/UIView%2BZZFontSetter.m