Check if custom Font exists in SwiftUI - ios

In UIKit I was able to access a custom font like this
guard let font = UIFont(name: "OpenSans-Regular", size: 12) else {
fatalError("Font not available")
}
In SwiftUI we get a custom font like this.
//Swift UI Version
let font = Font.custom("OpenSans-Regular", size: 12)
The issue seems to be that if you have not "registered" the font in the UIKit version you would get the fatal error. Which is fine as you could just register the font at that point if needed.
The SwiftUI version seems to just return the system SF font if the font is not registered.
I would like to know a way to check if a font has been registered before I access it view SwiftUI.

UIFont exists in SwiftUI as well. Check the value, and set a #State value based on the result. Font has a completely different use; it's always is going to resolve to something. UIFont didn't go away with the release of SwiftUI (nor did CoreText or a many other tools).

Related

Accessibility Inspector Warning for Dynamic Font Type

We implemented Dynamic Font type for our iOS native app. We customized the font sizes based on the our custom guidelines.
For example Body text style aEEELarge size is 53. But as per our custom guidelines we restricted maximum font size to 33. We used the following code snippet which is working perfectly.
Code Snippet :
var customFont = UIFont.preferredFont(forTextStyle: UIFontTextStyle.body)
customFont = UIFontMetrics.default.scaledFont(for: customFont, maximumPointSize: 33)
forLabel.font = customFont
So the problem is, Accessibility Inspector is showing the warning as below. even though we enable adjustsFontForContentSizeCategory = true , still we see warning.
If we change the maximumPointSize as 50 the warning is going away. But as per our Guidelines maximum size is 33. Is there any solution to suppress Accessibility Inspector warning ? Please help us if you know the solution.

Custom Fonts Bug

TL;DR: Custom fonts couldn't be used programmatically before using them in a Storyboard/xib.
Note: I've checked out this, tried the answers and they didn't work. I've also made sure that they're in target membership.
I've noticed a strange bug while changing segment control title a custom font:
segmentedControl.titleTextAttributes = NSDictionary(objects: [UIFont.init(name: "Comfortaa-Regular",
size: UIFont.systemFontSize)!,
UIColor.white],
forKeys: [NSAttributedStringKey.font as NSCopying,
NSAttributedStringKey.foregroundColor as NSCopying]) as? [AnyHashable : Any]
It couldn't find the font, so unwrapping has failed. But the font could be seen in the Storyboard.
It's properly added to the project, here's the CopyBundle and InfoList:
So here's the catch; if I use it in the Storyboard, it is shown in the font families:
But if not, it's not shown -here I've changed to light and bold has disappeared-, and cannot be used programmatically.
I'm using Xcode Version 9.0 (9A235), and Swift 4. I've also checked OpenRadar and couldn't find a submission regarding this.
The mentioned font: Comfortaa
#EDUsta, I just tried with given font and its work ok, no issue in it, giving the step which i followed:
Add the Comfortaa-Bold.ttf, Comfortaa-Light.ttf, Comfortaa-Regular.ttf Font files to project.
2.Add the entries of Fonts in info.plist file
Make sure the font added in project target.
After it, apply the fonts on UILabel and UISegmentedControl using Swift code given below:
let fontFirst = UIFont(name: "Comfortaa-Bold", size: 16.0)!
segmentFont.setTitleTextAttributes([NSAttributedStringKey.font : fontFirst, NSAttributedStringKey.foregroundColor : UIColor.red],
for: .normal)
labelBold.font = UIFont(name: "Comfortaa-Bold", size: 16.0)
labelLight.font = UIFont(name: "Comfortaa-Light", size: 16.0)
labelRegular.font = UIFont(name: "Comfortaa-Regular", size: 16.0)
its work perfectly, you can check in below screenshot image:
For your reference i am adding the complete project here:
I have the same problem. I can't add exactly the same font family (Comfortaa) programatically - everytime it crashes, but once I add label in launchscreen and set font to Comfotaa-Bold, font loaded from code works fine and doesn't crash. So my solution is to add 3 labels with fonts such as - Comfortaa Bold, Comfortaa Regular, Comfortaa Light in launchscreen and set "hidden" flag on true. This way I'm able to use all of them programatically.

How to display icon using font ? ios

I got a file(please find attached file) which contain font, this font supposed to display icons according to code number.
but i didn't succeed to display any icon with this font. here is my code:
iconTest = UILabel();
iconTest.frame = CGRectMake(0, 0, 100, 100);
onTest.center = self.view.center;
iconTest.font = UIFont(name: "icomoon", size:16.0);
iconTest.text = "e906";
what's the correct way to display icons using font !
download font svg file
You have to set text property like:
iconTest.text = "\u{e906}";
Do not forget to register your custom font in your app.
Follow these steps:
Install fonts by double clicking on them.
Drag and drop fonts in Xcode and make sure they are added to target. (check copy items if needed)
In info.plist, set key Fonts provided by application and add font name for item(under key)
Set font type custom in storyboard for your controls or programatically assign font to UILabel
Code:
//In swift 3
let font = UIFont(name: "iconmoon", size: 15)
btnSignout.setTitle("\u{e913}", for: UIControlState.normal) // set font icon on UIButton
btnSignout.titleLabel!.font = font
// In objectiveC
_lbl.text = [NSString stringWithUTF8String:"\ue92e"]; // set font icon on UILabel
_lbl.font = [UIFont fontWithName:#"iconmoon" size:16];
Note: \u prefix is mandatory, Example for unicode e626, the label text should be \ue626 or \u{e626}
I use icon font in some of my projects. I have create a project to use icon font easily. The README of this project is written in Chinese. But the demo project will show everything clearly. https://github.com/JohnWong/IconFont
Icon font is always used in UILabel by setting text. But I think creating a UIImage from font is more flexible. This is why I create this project.
Method of register font by setting project is in answer provided by martin. Here is a way to register font by code: https://github.com/JohnWong/IconFont/blob/master/IconFont/TBCityIconFont.m#L16
Icomoon.swift: Use your Icomoon fonts with Swift - auto-generates type safe enums for each icon.
Despite it's not IcoMoon, this library is worth noting:
https://github.com/0x73/SDevIconFonts
It integrates FontAwesome, Ionicons, Octicons and Iconic as Icon Fonts.
Assign them with code as easy as:
label.font = UIFont.iconFontOfSize(.FontAwesome, fontSize: 50.0)
label.text = String.fontAwesomeIconWithName(.Twitter)
As noted before, you have to register the font files in your app's Info.plist.
Anyway, regarding IcoMoon: I would use the above library as a starting point. Should be fairly easy (*) to add IcoMoon in a fork (or better as a pull request).
(*) technically spoken, adding a list of convenience shortcuts like .Twitter is quite an expensive task when I have a look at https://github.com/0x73/SDevIconFonts/blob/master/SDevIconFonts/Classes/FontAwesome.swift.

Setting other font than system in WatchKit (Apple Watch)

I have one Apple Watch app that is using Menlo Bold font for label.
In first version of Xcode that supported watchkit I was able to change font of label in storyboard to Menlo Bold 36 and everything was working fine.
In curent version (Xcode 6.2) that is not possible any more, so I found this tutorial on how to set custom font in Apple Watch, http://www.tech-recipes.com/rx/53710/how-do-i-use-custom-fonts-in-my-apple-watch-app/
I this tutorial I found this code:
func printFonts() {
let fontFamilyNames = UIFont.familyNames()
for familyName in fontFamilyNames {
println("------------------------------")
println("Font Family Name = [\(familyName)]")
let names = UIFont.fontNamesForFamilyName(familyName as String)
println("Font Names = [\(names)]")
}
}
This code print available fonts.
It is used to see why is the name of the font that you have added.
At this stage I have not added any custom font, but I run this function just to see what font are available on Apple Watch by default.
After running this I found:
/* lot of fonts before */
------------------------------
Font Family Name = [Menlo]
Font Names = [[Menlo-BoldItalic, Menlo-Regular, Menlo-Bold, Menlo-Italic]]
------------------------------
/* lot of fonts after */
It look like that my Menlo-Bold is available on Apple Watch, but I just can not select it in StoryBoard.
So , I was think this is very good, I do not need to add font I will just use it.
This is my code:
// must maee attributed text
let attributedTextForHour = NSAttributedString(
string: "IS IT WORKING",
attributes: NSDictionary(object: UIFont(name: "Menlo-Bold", size: 36)!, forKey:NSFontAttributeName))
// with atributex text
mylabel.setAttributedText(attributedTextForHour)
When I run this code in simulator, font of the label is not changed.
And here are some other strange things:
in debugger, when I set break point on mylabel.setAttributedText(attributedTextForHour) and do quick look on attributedTextForHour it is showed in correct font.
So in debugger it is fine, but on simulator it is not.
So how to fix this ?
I do not have Apple Watch, so I can see what is happening on real device.
So, I do no know is there some problem in my code or this is bug form Apple.
If somebody can test this on the is computer and report results, that will be useful also.
Maybe whole problem is because I have not added Menlo Bold font from outside and I am using what printFont() function has shown.
So if anybody know where I can download Menlo Bold font, please provide link, so that I can test that also.
I manage to solve this problem, so I am posting for future generations.
There are few things that I have learned from this (after 3h of work)
Font that are by default printed by printFonts() they look-like that are available but they are not.
you can add your *.otf font by following http://www.tech-recipes.com/rx/53710/how-do-i-use-custom-fonts-in-my-apple-watch-app/ and then you can just select it in Storybord by custom font, so you do not need to make NSAttributedString
If you want to add font that is already printed in printFonts() that things become complicated.
You can not add it by same name, so you must add it with different name, I called it Menlo-Bold-My.otf, and you must change some ID of font.
So Menlo-Bold-My.otf is same as Menlo-Bold.otf from Apple.
For converting, manipulating fonts I used program http://fontforge.github.io/en-US/

WatchKit WKInterfaceLabel can't change font

I'm trying to change label font. But every font I set in the Attributes Inspector different from the system font - don't change anything - neither simulator or storyboard. I even tried to set the font programatically with Attributed string - the same System font appears. Thanks for your help.
You cannot use the included iOS fonts in WatchKit at this time. The only one available is System (San Francisco). Source: Apple Developer Forums
You can however use a custom font by adding the font file to the project:
Drag the font files into the project navigator
Include the custom font file in both your WatchKit app and WatchKit
extension bundle.
Add the Fonts provided by application (UIAppFonts) key to both your WatchKit app and your WatchKit Extension Info.plist files
Add this code to awakeWithContext to make sure you know the correct font name to call later in your code:
print("Custom font names:")
print(UIFont.fontNames(forFamilyName: "Exo"))
print(UIFont.fontNames(forFamilyName: "Tabardo"))
Run the app and take note of the font names printed to the debug console. Once you know the correct name, you can add this code somewhere in your WatchKit Extension:
var fontSize = CGFloat(32)
var text = "so cool"
var cstmFont = UIFont(name: "Tabardo", size: fontSize)!
var attrStr = NSAttributedString(string: text, attributes:
[NSFontAttributeName: cstmFont])
firstLabel.setAttributedText(attrStr)
fontSize = CGFloat(36)
text = "right on!"
cstmFont = UIFont(name: "Exo-Regular", size: fontSize)!
attrStr = NSAttributedString(string: text, attributes:
[NSFontAttributeName: cstmFont])
secondLabel.setAttributedText(attrStr)
Enjoy the custom fonts on the watch!
Keep in mind that glances and notifications cannot use custom fonts. If you want to use one there, you'll have to use a rendered image. However because glances and notifications should load quickly you'd want to have that image ready to go when it gets called.

Resources