bLacK hoLE
bLacK hoLE

Reputation: 801

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)

Upvotes: 46

Views: 45602

Answers (8)

Giuseppe Mazzilli
Giuseppe Mazzilli

Reputation: 492

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

Upvotes: 2

tiritea
tiritea

Reputation: 1279

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)

Upvotes: 22

Bartosz Olszanowski
Bartosz Olszanowski

Reputation: 818

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.

Upvotes: 3

Van Du Tran
Van Du Tran

Reputation: 6892

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".

enter image description here

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

enter image description here



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.

enter image description here



  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. enter image description here



So in your code:

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

Upvotes: 179

Mocha
Mocha

Reputation: 2253

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

Upvotes: 0

Shivani Bajaj
Shivani Bajaj

Reputation: 1046

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 E.g 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 :)

Upvotes: 6

abanet
abanet

Reputation: 1387

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.

Upvotes: 18

Hafiz Anser
Hafiz Anser

Reputation: 581

enter image description here (1)First select the "Font" folder then make sure it's selected.

Upvotes: 8

Related Questions