UISegmentedControl setTitleTextAttributes:forState: not working well with font - ios

I have a UISegmentedControl that I'm trying to customize, and I'm having two problems :
This is my code :
NSDictionary *attributes = #{UITextAttributeFont: [UIFont fontWithName:#"Gotham-Book" size:14.f],
UITextAttributeTextColor: [UIColor whiteColor],
UITextAttributeTextShadowColor: [UIColor clearColor]};
[segmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];
NSDictionary *selectedAttributes = #{UITextAttributeFont: [UIFont fontWithName:#"Gotham-Medium" size:14.f],
UITextAttributeTextColor: [UIColor redColor]};
[segmentedControl setTitleTextAttributes:selectedAttributes forState:UIControlStateSelected];
1) The UISegmentedControl reacts well for the UIControlStateNormal but for the forState:UIControlStateSelected, the color works but not the font. FYI, the font exists because if I switch "Gotham-Book" and "Gotham-Medium" for UIControlStateNormal, I see the difference.
2) Before I've set the font for the UIControlStateNormal, the text was vertically aligned, but now it's not anymore. How could I change the textInsets ?
Thank's for your help !

On IOS 7 use NSFontAttributeName, NSForegroundColorAttributeName and NSShadowAttributeName (if needed),
For backward compatibility I using both variants, like:
NSDictionary *attributes = #{UITextAttributeFont: [UIFont fontWithName:#"Gotham-Book" size:14.f],
UITextAttributeTextColor: [UIColor whiteColor],
UITextAttributeTextShadowColor: [UIColor clearColor],
NSFontAttributeName: [UIFont fontWithName:#"Gotham-Book" size:14.f],
NSForegroundColorAttributeName: [UIColor whiteColor],
};
[segmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];

Related

UINavigationBar: Changing the font programmatically

I'm implementing a UINavigationBar with some text on it but I want to change the font in the UINavigationBar text any of you knows if is posible to change font in the text programmatically?
I'll really appreciate your help
From iOS 7 and later:
NSShadow* shadow = [NSShadow new];
shadow.shadowOffset = CGSizeMake(0.0f, 1.0f);
shadow.shadowColor = [UIColor redColor];
[[UINavigationBar appearance] setTitleTextAttributes: #{
NSForegroundColorAttributeName: [UIColor greenColor],
NSFontAttributeName: [UIFont fontWithName:#"Helvetica" size:20.0f],
NSShadowAttributeName: shadow
}];

uitabbaritem changing font size

I am using the following code to change the font of UITabBaritem inside a subclass of UITabBarController . Its working in iOS 8 whether this code is compatible with iOS 7.
Thank you
[[UITabBarItem appearance] setTitleTextAttributes:#{NSFontAttributeName : [UIFont fontWithName:#"HelveticaNeue-Bold" size:17.0f],
NSForegroundColorAttributeName : [UIColor whiteColor]
} forState:UIControlStateNormal];
[[UITabBarItem appearance] setTitleTextAttributes:#{NSFontAttributeName : [UIFont fontWithName:#"HelveticaNeue-Bold" size:17.0f],
NSForegroundColorAttributeName : [UIColor grayColor]
} forState:UIControlStateSelected];

Is there a way to change title in navigation bar to Italic, Bold and underlined without changing font?

I use the UIAppearance to change attributes of my title in Navigation Bar like so:
[[UINavigationBar appearance] setTitleTextAttributes:#{NSForegroundColorAttributeName : [MM mainTitleColor]}];
But I have not found the way to make text underlined or italic, is there a way to do this without changing the font alltogether?
No. These properties you cant change unless font changing. Because the available keys under the appearance proxy are
UITextAttributeFont
UITextAttributeTextColor
UITextAttributeTextShadowColor
UITextAttributeTextShadowOffset
Change these properties to customize the UINavigationBar
If you looking for font change, then see the below example
[[UINavigationBar appearance] setTitleTextAttributes:#{
UITextAttributeTextColor: TEXT_COLOR,
UITextAttributeTextShadowColor: SHADOW_COLOR,
UITextAttributeTextShadowOffset: [NSValue valueWithUIOffset:UIOffsetMake(0, -1)],
UITextAttributeFont: [UIFont fontWithName:#"Arial-Bold" size:0.0],
}];
Try this one.
You have to customise your navigation controller with adding a imageview.
UIFont *yourFont = [UIFont fontWithName:#"Helvetica-BoldOblique" size:[UIFont systemFontSize]];
if ([[UINavigationBar class]respondsToSelector:#selector(appearance)]) {
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:#"myimage.png"] forBarMetrics:UIBarMetricsDefault];
}
[[UINavigationBar appearance] setTitleTextAttributes:#{
UITextAttributeTextColor : [UIColor clearColor],
UITextAttributeTextShadowColor : [UIColor blackColor],
UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetMake(1, 0)],
UITextAttributeFont : yourFont
}];
You can use :
Optima-BoldItalic
TimesNewRomanPS-BoldItalicMT
Baskerville-BoldItalic
HelveticaNeue-BoldItalic
TrebuchetMS-Bold
Helvetica-BoldOblique
You can try below code to make your text italic and bold.
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
shadow.shadowOffset = CGSizeMake(0, 1);
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,
shadow, NSShadowAttributeName,
[UIFont fontWithName:#"HelveticaNeue-BoldItalic" size:21.0], NSFontAttributeName, nil]];
[self setTitle:#"Title text"];

UISegmentedControl Text Color Issue

I am using this for changing the text color of text of segmented control but its color is not getting changed in UIControlStateNormal. I have to kept the same color for both states.
NSDictionary *highlightedAttributes = [NSDictionary
dictionaryWithObject:[UIColor blueColor] forKey:UITextAttributeTextColor];
[self.segmentController
setTitleTextAttributes:highlightedAttributes forState:UIControlStateSelected];
You have to set any attributes explicitly for the normal state (UIControlStateNormal) as well.
Try this:
NSDictionary *textAttributes = #{NSFontAttributeName: [UIFont systemFontOfSize:13],
UITextAttributeTextColor: UIColorFromRGB(0x93938D),
UITextAttributeTextShadowColor: [UIColor clearColor]
};
[self.segmentController setTitleTextAttributes:textAttributes forState:UIControlStateNormal];
[self.segmentController setTitleTextAttributes:textAttributes forState:UIControlStateSelected];

Why does UISegementedControl's setTitleTextAttributes only change the text color but not the font face/weight for active state?

With the following code I try to change the appearance of a UISegmentedControl, but only the text color changes with highlighted or selected tabs. Font face and weight are taken from the inactive attributes, so that all parts of the segmented control show Futura-Medium on the title label, no matter if highlighted, selected or normal. Why is this?
NSDictionary *attributesActive = [NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:#"AmericanTypewriter-Bold" size:22.f], UITextAttributeFont,
[UIColor redColor], UITextAttributeTextColor,
[UIColor clearColor], UITextAttributeTextShadowColor,
nil];
NSDictionary *attributesInactive = [NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:#"Futura-Medium" size:16.f], UITextAttributeFont,
[UIColor greenColor], UITextAttributeTextColor,
[UIColor clearColor], UITextAttributeTextShadowColor,
nil];
[segmentedControl setTitleTextAttributes:attributesActive forState:UIControlStateHighlighted];
[segmentedControl setTitleTextAttributes:attributesActive forState:UIControlStateSelected];
[segmentedControl setTitleTextAttributes:attributesInactive forState:UIControlStateNormal];

Resources