2012-08-10 8 views
30

निर्दिष्ट किए बिना पूरे आईओएस ऐप के लिए एक कस्टम फ़ॉन्ट कैसे सेट करें मैं अपने iOS app में एक कस्टम फ़ॉन्ट लागू करने की कोशिश कर रहा हूं। मैंने पाया कि मैं इस्तेमाल कर सकते हैं:आकार

[[UILabel appearance] setFont:[UIFont fontWithName:@"Proxima Nova" size:17.0]]; 
  • सभी UILabels का डिफ़ॉल्ट फ़ॉन्ट और आकार निर्धारित करने के लिए। हालांकि, मेरे सभी UILabels समान फ़ॉन्ट आकार साझा नहीं करते हैं।

  • Set a default font for whole iOS app? में, किसी के पास एक ही चिंता थी, और आकार को पैरामीटर सेट करने के लिए कहा गया था ताकि फ़ॉन्ट को केवल फ़ॉन्ट सेट किया जा सके और फ़ॉन्ट आकार न हो।

  • जब मैंने ऐसा करने का प्रयास किया, तो मेरे ऐप में सभी UILabel टेक्स्ट गायब हो गया (क्योंकि स्पष्ट रूप से iOS ने 0.0 फ़ॉन्ट आकार को शाब्दिक रूप से लिया)।

कोई सुझाव है कि मैं सार्वभौमिक रूप से फ़ॉन्ट कैसे सेट कर सकता हूं लेकिन आकार नहीं? आपका बहुत बहुत धन्यवाद!

उत्तर

23
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self setFontFamily:@"FagoOfficeSans-Regular" forView:self.view andSubViews:YES]; 
} 

-(void)setFontFamily:(NSString*)fontFamily forView:(UIView*)view andSubViews:(BOOL)isSubViews 
{ 
    if ([view isKindOfClass:[UILabel class]]) 
    { 
     UILabel *lbl = (UILabel *)view; 
     [lbl setFont:[UIFont fontWithName:fontFamily size:[[lbl font] pointSize]]]; 
    } 

    if (isSubViews) 
    { 
     for (UIView *sview in view.subviews) 
     { 
      [self setFontFamily:fontFamily forView:sview andSubViews:YES]; 
     } 
    }  
} 
+8

+1 हालांकि, यदि आपका ऐप UITableView का उपयोग कर रहा है तो यह दृष्टिकोण विफल हो जाता है। व्यक्तिगत कोशिकाओं में लेबल इस प्रक्रिया द्वारा अद्यतन नहीं किए जाएंगे। – Fostah

+4

हां, लेकिन क्या? UITableViewCells में UILabels को संभालना चाहे वे कस्टम हों या निर्मित हों, आपकी तालिका के सेल ForRowAtIndexPath विधि में टेक्स्ट की एक पंक्ति का विषय है। –

+1

यह सबसे अच्छा हो सकता है जो आप कर सकते हैं, लेकिन दूसरी बात यह समाधान संबोधित नहीं करता है, जब आप फोंटऑफिससैन-बोल्ड "जैसे फोंट के लिए अलग परिवार रखते हैं तो बोल्ड या इटैलिक जैसे अलग-अलग फ़ॉन्ट स्टाइल होते हैं। – d512

12

मैं अपने प्रोजेक्ट में स्वीकार किए जाते हैं जवाब का उपयोग किया है, लेकिन एक अधिक सामान्य समारोह की जरूरत है, तो यह हर एक संभव के लिए फ़ॉन्ट बदल देंगे, यह भी मैं कुछ शेयर फोंट के बीच एक मैपिंग स्थापित करने के लिए अपने चुने हुए हमारे कस्टम फोंट के लिए, इसलिए वे स्टोरीबिल्डर और xib फ़ाइलों के माध्यम से भी पहुंच योग्य होंगे।

+ (void)setupFontsForView:(UIView *)view andSubViews:(BOOL)isSubViews 
{ 
    if ([view respondsToSelector:@selector(setFont:)] && [view respondsToSelector:@selector(font)]) { 
     id  viewObj = view; 
     UIFont *font = [viewObj font]; 

     if ([font.fontName isEqualToString:@"AcademyEngravedLetPlain"]) { 
      [viewObj setFont:[UIFont fontWithName:PRIMARY_FONT size:font.pointSize]]; 
     } else if ([font.fontName hasPrefix:@"AmericanTypewriter"]) { 
      [viewObj setFont:[UIFont fontWithName:SECONDARY_FONT size:font.pointSize]]; 
     } 
    } 

    if (isSubViews) { 
     for (UIView *sview in view.subviews) { 
      [self setupFontsForView:sview andSubViews:YES]; 
     } 
    } 
} 
7

लेबल के लिए श्रेणी लिखकर हम पूरे ऐप के फ़ॉन्ट बदल सकते हैं।

@implementation UILabel (CustomeFont) 

-(void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    [self setBackgroundColor:[UIColor clearColor]]; 
    [self setFont:[UIFont fontWithName:@"Helvetica" size:self.font.pointSize]]; 
} 

@end 
+5

आप क्लास विधियों को ओवरराइड करने से दृढ़ता से निराश हैं। कम से कम मूल कार्यान्वयन का आह्वान करने का कोई तरीका नहीं है। – beryllium

3

UIView + DefaultFontAndColor.h

#import <UIKit/UIKit.h> 

@interface UIView (DefaultFontAndColor) 

-(void)setDefaultFontFamily:(NSString*)fontFamily andSubViews:(BOOL)isSubViews andColor:(UIColor*) color; 
@end 

UIView + DefaultFontAndColor.m

#import "UIView+DefaultFontAndColor.h" 

@implementation UIView (DefaultFontAndColor) 

//sets the default font for view classes by default 
-(void)setDefaultFontFamily:(NSString*)fontFamily andSubViews:(BOOL)isSubViews andColor:  (UIColor*) color 
{ 
    if ([self isKindOfClass:[UILabel class]]) 
    { 
     UILabel *lbl = (UILabel *)self; 
     [lbl setFont:[UIFont fontWithName:fontFamily size:[[lbl font] pointSize]]]; 

     if(color) 
      lbl.textColor = color; 
    } 
    else if ([self isKindOfClass:[UIButton class]]) 
    { 
     UIButton *btn = (UIButton *)self; 
     [btn.titleLabel setFont:[UIFont fontWithName:fontFamily size:[[btn.titleLabel font] pointSize]]]; 

     if(color) 
     { 
      btn.tintColor = color; 
     } 
    } 

    if (isSubViews) 
    { 
     for (UIView *sview in self.subviews) 
     { 
      [sview setDefaultFontFamily:fontFamily andSubViews:YES andColor:color]; 
     } 
    } 
} 
@end 

@usage: रंग के बिना:

#import "UIView+DefaultFontAndColor.h" 

UIView myView = [[UIView alloc] init] 
[myView setDefaultFontFamily:@"Arial" andSubViews:YES andColor:nil]; 

@usage: रंग के साथ:

#import "UIView+DefaultFontAndColor.h" 

UIView myView = [[UIView alloc] init] 
[myView setDefaultFontFamily:@"Arial" andSubViews:YES andColor:[UIColor greenColor] ]; 
17

यहाँ ऑब्जेक्टिव-सी में एक समाधान है, इस श्रेणी डाल कहीं भी आप UILabelFontSize की स्थापना के बिना UILabelApperance बदलना चाहते हैं:

@implementation UILabel (SubstituteFontName) 
- (void)setSubstituteFontName:(NSString *)name UI_APPEARANCE_SELECTOR { 
    self.font = [UIFont fontWithName:name size:self.font.pointSize]; 
} 
@end 

उसके बाद, आप बदल सकते हैं Apperance साथ:

[[UILabel appearance] setSubstituteFontName:@"SourceSansPro-Light"]; 
+2

उत्सुक देवताओं के लिए छोटी जानकारी: "यूआईपीपीरेंस विधि हस्ताक्षर में UI_APPEARANCE_SELECTOR मैक्रो की तलाश करता है। इस एनोटेशन के साथ किसी भी विधि को उपस्थित प्रॉक्सी के साथ उपयोग किया जा सकता है।" [http://nshipster.com/uiappearance/](http://nshipster.com/uiappearance/) – Zeb

+0

स्विफ्ट Appdelegate में इसका उपयोग कैसे करें? –

+0

यह बहुत समय काम करता है और बचाता है! धन्यवाद !! –

5

स्विफ्ट 3 https://gist.github.com/dimohamdy/c47992e14c1a3ee3315c06e2480e121e

आप लेबल फ़ॉन्ट के लिए उपस्थिति सेट नहीं कर सकते हैं जो मुझे डिफ़ॉल्ट फ़ॉन्ट का अन्य मूल्य बनाते हैं और जब मैं नया फ़ॉन्ट सेट करता हूं तो मुझे केवल नए फ़ॉन्ट का नाम मिलता है और लेबल का पुराना आकार मिलता है और इसे सेट करता है फ़ॉन्ट

//when you want to set font for all labels in Application 
    UILabel.appearance().defaultFont = UIFont.systemFont(ofSize: 15/*Any Value*/, weight: UIFontWeightThin) 

extension UILabel{ 
    dynamic var defaultFont: UIFont? { 
     get { return self.font } 
     set { 
      //get old size of lable font 
      let sizeOfOldFont = self.font.pointSize 
      //get new name of font 
      let fontNameOfNewFont = newValue?.fontName 
      self.font = UIFont(name: fontNameOfNewFont!, size: sizeOfOldFont) 
     } 
    } 
    } 
+0

आप यह बताकर अपने जवाब को बेहतर बना सकते हैं कि यह कैसे काम करता है। –

+0

@JamesK कृपया इस अद्यतन को चेक करें –

-1

रायगेट का उत्तर अला स्विफ्ट ...

import UIKit 

extension UIViewController { 
    func setFontFamilyForView(_ fontFamily: String, view: UIView, andSubviews: Bool) { 
     if let label = view as? UILabel { 
      label.font = UIFont(name: fontFamily, size: label.font.pointSize) 
     } 

     if let textView = view as? UITextView { 
      textView.font = UIFont(name: fontFamily, size: textView.font!.pointSize) 
     } 

     if let textField = view as? UITextField { 
      textField.font = UIFont(name: fontFamily, size: textField.font!.pointSize) 
     } 

     if andSubviews { 
      for v in view.subviews { 
       setFontFamilyForView(fontFamily, view: v, andSubviews: true) 
      } 
     } 
    } 
} 
+0

यदि आप किसी उत्तर का एक स्विफ्ट संस्करण जोड़ना चाहते हैं, तो मूल उत्तर संपादित करें, कृपया। नया स्विफ्ट उत्तर न बनाएं। वैसे भी यह एक उद्देश्य-सी सवाल है। – Sulthan

+0

आपकी समस्या क्या है? जवाब संपादित नहीं कर सकता क्योंकि यह मेरा नहीं है, चरित्र सीमा के कारण उस स्निपेट को टिप्पणी में नहीं जोड़ सका। मुझे यह प्रश्न मिला, भले ही मैं स्विफ्ट में काम कर रहा हूं, इसलिए स्पष्ट रूप से अन्य भी होंगे। मैंने सोचा कि यह स्निपेट उनके लिए सहायक हो सकता है। क्या आपके पास दूसरों की मदद करने के लिए लोगों को परेशान करने के अलावा अन्य कुछ करने के लिए बेहतर नहीं है? – loglesby

+0

अलग-अलग भाषाओं में दो समान उत्तर देने की आवश्यकता नहीं है। यहां तक ​​कि यदि उत्तर आपका नहीं है, तो अगर आप पर्याप्त प्रतिष्ठा रखते हैं, या यदि आप नहीं करते हैं, तो आप इसे संपादित कर सकते हैं, स्विफ्ट संस्करण के लिए पूछने पर एक टिप्पणी जोड़ें। इससे ब्रांड के नए उत्तर जोड़ने से अन्य उपयोगकर्ताओं की मदद मिलेगी। एक नया उत्तर जोड़ना अंतिम उपाय होना चाहिए, पहले नहीं। – Sulthan