简体   繁体   中英

custom font not working programmatically in swift

I've followed the step to to add custom fonts in xcode at swift day-by-day and custom fonts but I'm not able to set that font in app label programmatically.

var labeladd = UILabel(frame: CGRectMake(40, 50, 70, 22))
    //  label.center = CGPointMake(160, 284)
 ///  labeladd.font=UIFont.boldSystemFontOfSize(15)
   labeladd.font = UIFont(name:"Source Sans Pro",size:15)
    labeladd.textColor=UIColor.blackColor()
    labeladd.textAlignment = NSTextAlignment.Center
    labeladd.text = "this is custom fonts"
    myview.addSubview(labeladd)

Let's say you want to add this font: SourceSansPro-Regular.otf

Four steps:

  1. Add the font file SourceSansPro-Regular.otf to your project, make sure you select your target in the "Add to targets".

在此处输入图片说明

Go to the target's Build Phases and make sure it is under Copy Bundle Resources . If not, add it.

在此处输入图片说明



2. Go to the target's Info . Add a new entry Font provided by application then add a new item with this value SourceSansPro-Regular.otf .

在此处输入图片说明



  1. From your finder, double click on the file SourceSansPro-Regular.otf , it might ask you to install the font to your Font Book.



  1. Open the OS X Font Book application, navigate to your font then press Command+i . Note the PostScript name and use that name in your Swift code. In this case, it's SourceSansPro-Regular . 在此处输入图片说明



So in your code:

labeladd.font = UIFont(name:"SourceSansPro-Regular", size:15)

Sometimes the name of the font is not the name of your file. I was trying to use the NexaBook.otf font with the name "NexaBook" and at the end the problem was that the right name of the font is "Nexa-Book". To check you are using the right name write this code in the viewDidLoad and check the name of the font:

for family: String in UIFont.familyNames
    {
        print(family)
        for names: String in UIFont.fontNames(forFamilyName: family)
        {
            print("== \(names)")
        }
    }

In my case I got:

...
Nexa
== Nexa-Book
Avenir Next
== AvenirNext-Medium
== AvenirNext-DemiBoldItalic
== AvenirNext-DemiBold
...

I get this idea from Common Mistakes With Adding Custom Fonts to Your iOS App where you can find a great description of the problems working with custom fonts.

I've found (XCode 12) that unless your font happens to be already used in your Main.storyboard , that even if you have done all the correct steps of registering the font file in your app, copied to your bundle resources, used the PostScript name, yadda, yadda, that it still didnt show up and trying to use it in UIFont(name: size:) would still return nil. :-(

I worked around this current bug (?) by manually registering all my custom fonts at startup in AppDelegate application(_ application: didFinishLaunchingWithOptions:)

let fonts = Bundle.main.urls(forResourcesWithExtension: "ttf", subdirectory: nil)
fonts?.forEach({ url in
    CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil)
})

(adapted from Xcode: Using custom fonts inside Dynamic framework )

在此处输入图片说明 (1)First select the "Font" folder then make sure it's selected.

If you are getting the font in storyboard but not in font family and are not able to set it progammatically, then the reason is that the Xcode might not have compiled the font. To solve it:

  1. Set the required font(say: Roboto Bold) as the font of any UI element on storyboard Eg UILabel.
  2. Run the project
  3. Now check the font family names. The required font(say: Roboto Bold) name would have appeared in it.
  4. Now you can set the required font(say: Roboto Bold) progammatically :)

I was struggling with the issue quite a long time. It turned out that I forgot to add a .ttf / .otf extension to the font name in Info.plist.

If you are adding a custom font within a framework, you need to manually load the font in app delegate before using it.

Xcode: Using custom fonts inside Dynamic framework

Follow Apple Guide to:

Adding a Custom Font to Your App

Beyond this, I've found that if your font is not already present in a Storyboard item, UIFont.familyNames.sorted() won't list it.

The workaround is to make a storyboard, you can leave unused, and add there a UILabel for each custom font you want to be available programmatically, and then set your font as custom font from properties panel.

This is not clean solution, but I didn't find any other solution.

Best regards.

/GM

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM