2016-11-03 34 views
1

在我的应用程序中,我给予用户更改整个应用程序的字体的选项。要做到这一点,我给用户一个选项列表(如粗体,半角,常规,薄等)。只要用户选择任何上述选项,我将该值保存在NSUserDefaults中。如何以编程方式更改完整的iOS应用程序字体

现在,随着用户选择了他的选择,所以我应该改变我的整个应用程序的字体。出于同样我创建了一个类别

#import "UILabel+Helper.h" 

@implementation UILabel (Helper) 

- (void)setSubstituteFontName:(NSString *)name UI_APPEARANCE_SELECTOR { 

if ([name isEqual: kAppFontSFTextBold]) { 
    self.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; 
} 
else if ([name isEqual:kAppFontSFTextSemiBold]) { 
    self.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; 
} 
else if ([name isEqual: kAppFontSFTextMedium]) { 
    self.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 
} 
else if ([name isEqual: kAppFontSFTextRegular]) { 
    self.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; 
} 
else if ([name isEqual: kAppFontSFTextLight]) { 
    self.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2]; 
} 

// self.font = [UIFont fontWithName:name size:self.font.pointSize]; 
} 

@end 

,而是为了让我的应用程序,这些变化我必须以编程方式重新启动我的应用程序和苹果不支持。读了几个答案后,我才知道我可以用exit(0)强制终止我的应用程序。

现在只要用户选择选项,我将选择的值保存在本地,如前所述并退出(0)。现在,用户必须自行重新启动应用程序。

该方法是否正确。如果没有,那么请给我一个更好的解决方案。

+2

出口(0)将导致拒绝应用程式的从苹果 –

回答

0

你可以做以下事情。当用户选择字体时,您可以简单地触发NSNotification。您可以在每个UIViewController中添加一个观察者,其中有UILabel s。然后,您可以简单地在该方法中更改这些UILabel字体。

0

使用以下代码您可以实现您的目标代码。

1. -(void)setFonts{ 
     NSString *name = [[NSUserDefaults standardUserDefaults]objectForKey:@"langkey"]; ; 
     UIFont *font ; 
     if ([name isEqual: kAppFontSFTextBold]) { 
      font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; 
     } 
     else if ([name isEqual:kAppFontSFTextSemiBold]) { 
      font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; 
     } 
     else if ([name isEqual: kAppFontSFTextMedium]) { 
      font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 
     } 
     else if ([name isEqual: kAppFontSFTextRegular]) { 
      font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; 
     } 
     else if ([name isEqual: kAppFontSFTextLight]) { 
      font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2]; 
     } 

     [[UILabel appearance] setFont:font]; 

     [[UITextField appearance] setFont:font]; 

     [[UITextView appearance] setFont:font]; 
    } 

此方法可以在appdelegate中编写,并使用create appdelegate的实例进行调用。

这是用户定义的方法,因此您需要在用户选择发生时调用。

2

将下面的通知注册到每个VC到viewDidLoad结尾:。将它添加到所有VC或VC类别的基类中将会很好。

[[NSNotificationCenter defaultCenter] 
          addObserver:self 
          selector:@selector(preferredContentSizeChanged:) 
           name:UIContentSizeCategoryDidChangeNotification 
           object:nil]; 

然后在选择器方法更新与下面方法您的字体:

- (void)preferredContentSizeChanged:(NSNotification *)notification { 
    self.textView.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 
} 

更多细节参见Core Text

0
//Hope this helps : 

    AnyUIView.appearance().font = UIFont(name: "yourFont", size: yourSize) 

//code this inside AppDelegate in application:didFinishLaunchingWithOptions: method. and also , Be sure to add your chosen font to your projects target if you're using a custom font. 
相关问题