2016-11-03 10 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).

Теперь, как только пользователь выбирает параметр, я сохраняю выбранное значение в локальном, как сказано ранее, и exit (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 и позвонить, используя экземпляр приложения appdelegate.

это метод, определяемый пользователем, поэтому вам нужно позвонить во время вашего выбора пользователя.

2

Зарегистрируйте ниже уведомление о каждом VC до конца просмотраDidLoad:. Будет полезно добавить его в базовый класс всех категорий 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.