How do I make DTCoreText use the System Font? - ios

I want to use DTCoreText in my app to convert HTML to NSAttributedString, but I can't figure out how to use the system font (as of iOS 8: Helvetica Neue) as the base font. By default DTCoreText seems to create the NSAttributedString with the Times New Roman font.
I'd really prefer not to hardcode it. If Apple updates their font again (they previously updated it from Helvetica to Helvetica Neue) I don't want to replace all instances of it, or have a bunch of conditionals depending on the OS version running the code.
I tried:
NSDictionary *options = #{
DTUseiOS6Attributes: #(YES),
DTDefaultFontFamily: [UIFont systemFontOfSize:[UIFont systemFontSize]].fontName
};
But it still renders as Times New Roman.
How do I make it use the system font? I just want it to look normal.

Looks like DCCoreText is expecting to receive font family name, and you're providing font name which is different. Try to replace your code with
[UIFont systemFontOfSize:[UIFont systemFontSize]].familyName

Related

How to get the UIWebView's equivalent of the iOS 8 system font?

I am trying to use the very same font in a UIWebView on iOS that the iOS system uses currently.
This means I want to use the very same font I'd get from:
UIFontDescriptor *fd;
fd = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleBody];
UIFont *font = [UIFont fontWithDescriptor:fd size:0];
There are lots of answers on SO (iPhone Development - Setting UIWebView font, Using custom font in a UIWebView, How to change UIWebView default font, How to set custom font in UIWebView?) that explain how to embed a UIFont's familyName or fontName into an html's style attributes, by doing this:
NSString *fontStyle, *htmlString = #"test";
fontStyle = [NSString stringWithFormat:#"font-family:%#;font-size:%d", font.familyName, (int)font.pointSize];
htmlString = NSString stringWithFormat:#"<span style=\"%#\">%#</span>", fontStyle, htmlString];
But this doesn't seem to work on iOS 7 and 8 any more where these system font names are now like:
font.fontName: .HelveticaNeueInterface-Regular
font.familyName: .Helvetica Neue Interface
When using these names in an UIWebView with the "font-family" attribute, the text gets rendered in the default font (which is with serifs and certainly not the new iOS system font). Removing the leading period doesn't help, either.
So, how do I now translate the system's font into a name that gets correctly interpreted by the Web Kit?
Please understand that I am seeking for a generic solution and do not simply seek the iOS 7/8 name I can insert manually into the html style attribute.
I just ran into this blog article which may offer the solution though I have not verified it yet:
If you're trying to reference the system font in web views just prepend -apple-system to your font-family list and it'll use SF in iOS 9 and Helvetica in older versions.
Which means that the font line of above code needs to be change to:
fontStyle = [NSString stringWithFormat:#"font-family:-apple-system,Helvetica Neue;font-size:%d", (int)font.pointSize];
That should take care of selecting the system font from iOS 7 onward.
what about this article: http://furbo.org/2015/07/09/i-left-my-system-fonts-in-san-francisco/ from Craig Hockenberry?
Have you tried Helvetica or San Francisco with attaching font files?

Using styles of the iOS system font other than Regular in code

At the moment I know I can use [UIFont systemFontOfSize:15] to set the font of a UILabel to the system font. But how would I retrieve the medium style of the system font programmatically? There only seems to see a method with the regular style of the font to be applied.
At the moment I can only seem to use these fonts in IB:
You can use +systemFontOfSize:weight:, with one of the font weight constants from UIFontDescriptor.
Or, perhaps more appropriately, preferredFontForTextStyle: which respects the user's settings.

Create a new font family iOS

I am using three fonts of same family but only one font is applied to my UI as other fonts are overridden when i am using pixate framework.
I thought to create new families with one format and use.
How to create a new font family? Or is there any other alternate solution?
Did you set up your project and define .otf font files in plist? If it so;
You can get all families like this;
NSArray *familyNames = [UIFont familyNames];
this array will give you font names and whener you want will use.
viewLabel.font = [UIFont fontWithName:#"CustomFont-500" size:18.0];

custom font too small

I'm trying to set a custom font and, following the last answer to this question, I seem to have the font working in the project.
The only trick is that it's always the same size - too small. I'm trying to set it rather large but it's always small, no matter the size. Here's the line of code I'm using, as per the instructions in the above link.
self.timeLabel.font = [UIFont fontWithName:#"DistProTh" size:48];
I know the line works because I can change the font name (DistProTh) to something another font (say, Didot) and everything's fine. It therefore seems to me to be an issue with the font (which is freely available) but the font works ok in other applications (Stickies for example). Sadly, I'm no font expert..
The fontName parameter of the fontWithName: method is the full name of the font, not its file name. DistProTh is the file name; the full name of that font is District Pro Thin.
This should fix the problem:
self.timeLabel.font = [UIFont fontWithName:#"District Pro Thin" size:48];
Font name and file name are often the same, but that's not always the case. To look up the name of the font, locate your font in the Font Book application, and press Command+I to view font's information.
Turns out it needed what Font Book calls the "PostScript name" which, in the case of District Pro Thin is DistrictPro-Thin.
Incidentally, either the "PostScript name" or the "full name" (as per Font Book) worked for the font called "Code Light" but not for "District Pro Thin".

iPhone system font

What is the name of the default system font on the iPhone?
I would like to retrieve this for customizing a UIView.
To the delight of font purists
everywhere, the iPhone system
interface uses Helvetica or a variant
thereof.
The original iPhone, iPhone 3G and
iPhone 3GS system interface uses
Helvetica. As first noted by the
always excellent DaringFireball, the
iPhone 4 uses a subtly revised font
called "Helvetica Neue."
DaringFireball also notes that this
change is related to the iPhone 4
display rather than the iOS 4
operating system and older iPhone
models running iOS 4 still use
Helvetica as the system font.
iPod models released prior to the
iPhone use either Chicago, Espy Sans,
or Myriad and use Helvetica after the
release of the iPhone.
From http://www.everyipod.com/iphone-faq/iphone-who-designed-iphone-font-used-iphone-ringtones.html
For iOS9 it has changed to San Francisco. See http://developer.apple.com/fonts for more info.
If you're doing programatic customisation, don't hard code the system font. Use UIFont systemFontOfSize:, UIFont boldSystemFontOfSize: and UIFont italicSystemFontOfSize (Apple documentation).
This has become especially relevant since iOS 7, which changed the system font to Helvetica Neue.
This has become super especially relevant since iOS 9, which changed the system font again to San Francisco.
afaik iPhone uses "Helvetica" by default
< iOS 10
Swift
Specific font
Setting a specific font in Swift is done like this:
let myFont = UIFont(name: "Helvetica", size: 17)
If you don't know the name, you can get a list of the available font names like this:
print(UIFont.familyNames())
Or an even more detailed list like this:
for familyName in UIFont.familyNames() {
print(UIFont.fontNamesForFamilyName(familyName))
}
But the system font changes from version to version of iOS. So it would be better to get the system font dynamically.
System font
let myFont = UIFont.systemFontOfSize(17)
But we have the size hard-coded in. What if the user's eyes are bad and they want to make the font larger? Of course, you could make a setting in your app for the user to change the font size, but this would be annoying if the user had to do this separately for every single app on their phone. It would be easier to just make one change in the general settings...
Dynamic font
let myFont = UIFont.preferredFont(forTextStyle: .body)
Ah, now we have the system font at the user's chosen size for the Text Style we are working with. This is the recommended way of setting the font. See Supporting Dynamic Type for more info on this.
Related
Visual List of iOS Fonts
How do I make an attributed string using Swift?
You can always use
UIFont *systemFont = [UIFont systemFontOfSize:12];
NSLog(#"what is it? %# %#", systemFont.familyName, systemFont.fontName);
The answer is:
Up to iOS 6
Helvetica Helvetica
iOS 7
.Helvetica Neue Interface .HelveticaNeueInterface-M3
but you can just use Helvetica Neue
I'm not sure there is an api to get the default system font name. So I just get the name like this :
//get system default font
UILabel *label = [[UILabel alloc] init];
fontname = label.font.fontName;
[label release];
Looks stupid but it works.
Here is some update for supporting iOS 7. It has Dynamic Font Size now.
For any and all apps that support “Dynamic Type,” users can select a
font size in iOS 7 that works system wide, simply by visiting the
"General" section under "Settings" and selecting "Font Size."
UIFont *dynamicFont = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
And constants list, detailed explanation is here
NSString *const UIFontTextStyleHeadline;
NSString *const UIFontTextStyleSubheadline;
NSString *const UIFontTextStyleBody;
NSString *const UIFontTextStyleFootnote;
NSString *const UIFontTextStyleCaption1;
NSString *const UIFontTextStyleCaption2;
Category UIFontSystemFonts for UIFont (UIInterface.h) provides several convenient predefined sizes.
#interface UIFont (UIFontSystemFonts)
+ (CGFloat)labelFontSize;
+ (CGFloat)buttonFontSize;
+ (CGFloat)smallSystemFontSize;
+ (CGFloat)systemFontSize;
#end
I use it for chat messages (labels) and it work well when I need to get size of text blocks.
[UIFont systemFontOfSize:[UIFont labelFontSize]];
Happy coding!
UIFont *systemFont = [UIFont systemFontOfSize:[UIFont systemFontSize]];
This will give you the system font with the default system font size applied for the label texts by default.
Swift
You should always use the system defaults and not hard coding the font name because the default font could be changed by Apple at any time.
There are a couple of system default fonts(normal, bold, italic) with different sizes(label, button, others):
let font = UIFont.systemFont(ofSize: UIFont.systemFontSize)
let font2 = UIFont.boldSystemFont(ofSize: UIFont.systemFontSize)
let font3 = UIFont.italicSystemFont(ofSize: UIFont.systemFontSize)
beaware that the default font size depends on the target view (label, button, others)
Examples:
let labelFont = UIFont.systemFont(ofSize: UIFont.labelFontSize)
let buttonFont = UIFont.systemFont(ofSize: UIFont.buttonFontSize)
let textFieldFont = UIFont.systemFont(ofSize: UIFont.systemFontSize)
download required .ttf file
add the .ttf file under copy bundle resource, double check whether
the ttf file is added under resource
In info.pllist add the ttf file name as it is.
now open the font book add the .ttf file in the font book, select
information icon there you find the postscript name.
now give the postscript name in the place of font name
The default font for iOS is San Francisco . You can refer the link for further details

Resources