Skip to content

Commit d797840

Browse files
committed
dramatically improve uibarbuttonitem appearance customization
1 parent 7fbd17a commit d797840

File tree

3 files changed

+57
-56
lines changed

3 files changed

+57
-56
lines changed

Classes/ios/UIBarButtonItem+FlatUI.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,24 @@
1010

1111
@interface UIBarButtonItem (FlatUI)
1212

13+
// styles a single bar button item
14+
- (void) configureFlatButtonWithColor:(UIColor *)color
15+
highlightedColor:(UIColor *)highlightedColor
16+
cornerRadius:(CGFloat) cornerRadius UI_APPEARANCE_SELECTOR;
17+
18+
// styles all bar button items that exist within a class heirarchy (same as UIAppearanceProxy methods)
1319
+ (void) configureFlatButtonsWithColor:(UIColor *) color
1420
highlightedColor:(UIColor *)highlightedColor
15-
cornerRadius:(CGFloat) cornerRadius;
21+
cornerRadius:(CGFloat) cornerRadius
22+
whenContainedIn:(Class <UIAppearanceContainer>)containerClass, ... NS_REQUIRES_NIL_TERMINATION;
1623

24+
// styles all bar button items (can be overwritten with the above methods)
1725
+ (void) configureFlatButtonsWithColor:(UIColor *) color
1826
highlightedColor:(UIColor *)highlightedColor
19-
cornerRadius:(CGFloat) cornerRadius
20-
whenContainedIn:(Class <UIAppearanceContainer>)ContainerClass;
27+
cornerRadius:(CGFloat) cornerRadius;
28+
2129

30+
// removes the text shadows off a single bar button item (sadly, this can't be easily done for all buttons simultaneously)
2231
- (void) removeTitleShadow;
2332

2433
@end

Classes/ios/UIBarButtonItem+FlatUI.m

Lines changed: 31 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -11,54 +11,46 @@
1111

1212
@implementation UIBarButtonItem (FlatUI)
1313

14+
- (void) configureFlatButtonWithColor:(UIColor *)color
15+
highlightedColor:(UIColor *)highlightedColor
16+
cornerRadius:(CGFloat) cornerRadius {
17+
18+
[UIBarButtonItem configureItemOrProxy:self forFlatButtonWithColor:color highlightedColor:color cornerRadius:cornerRadius];
19+
20+
}
21+
1422
+ (void) configureFlatButtonsWithColor:(UIColor *) color
1523
highlightedColor:(UIColor *)highlightedColor
1624
cornerRadius:(CGFloat) cornerRadius {
1725

18-
UIImage *backButtonPortraitImage = [UIImage backButtonImageWithColor:color
19-
barMetrics:UIBarMetricsDefault
20-
cornerRadius:cornerRadius];
21-
UIImage *highlightedBackButtonPortraitImage = [UIImage backButtonImageWithColor:highlightedColor
22-
barMetrics:UIBarMetricsDefault
23-
cornerRadius:cornerRadius];
24-
UIImage *backButtonLandscapeImage = [UIImage backButtonImageWithColor:color
25-
barMetrics:UIBarMetricsLandscapePhone
26-
cornerRadius:2];
27-
UIImage *highlightedBackButtonLandscapeImage = [UIImage backButtonImageWithColor:highlightedColor
28-
barMetrics:UIBarMetricsLandscapePhone
29-
cornerRadius:2];
30-
31-
id appearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], [UINavigationController class], nil];
32-
33-
[appearance setBackButtonBackgroundImage:backButtonPortraitImage
34-
forState:UIControlStateNormal
35-
barMetrics:UIBarMetricsDefault];
36-
[appearance setBackButtonBackgroundImage:backButtonLandscapeImage
37-
forState:UIControlStateNormal
38-
barMetrics:UIBarMetricsLandscapePhone];
39-
[appearance setBackButtonBackgroundImage:highlightedBackButtonPortraitImage
40-
forState:UIControlStateHighlighted
41-
barMetrics:UIBarMetricsDefault];
42-
[appearance setBackButtonBackgroundImage:highlightedBackButtonLandscapeImage
43-
forState:UIControlStateHighlighted
44-
barMetrics:UIBarMetricsLandscapePhone];
45-
46-
[appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(1.0f, 1.0f) forBarMetrics:UIBarMetricsDefault];
47-
[appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(1.0f, 1.0f) forBarMetrics:UIBarMetricsLandscapePhone];
48-
49-
UIImage *buttonImage = [UIImage imageWithColor:color cornerRadius:cornerRadius];
50-
[appearance setBackgroundImage:buttonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
51-
52-
id toolbarAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil];
53-
[toolbarAppearance setBackgroundImage:[UIImage buttonImageWithColor:color cornerRadius:cornerRadius shadowColor:color shadowInsets:UIEdgeInsetsZero] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
26+
[self configureFlatButtonsWithColor:color highlightedColor:highlightedColor cornerRadius:cornerRadius whenContainedIn:[UINavigationBar class], [UINavigationController class], nil];
5427
}
5528

5629
+ (void) configureFlatButtonsWithColor:(UIColor *) color
5730
highlightedColor:(UIColor *)highlightedColor
5831
cornerRadius:(CGFloat) cornerRadius
59-
whenContainedIn:(Class <UIAppearanceContainer>)ContainerClass
60-
{
61-
32+
whenContainedIn:(Class <UIAppearanceContainer>)containerClass, ... {
33+
va_list vl;
34+
va_start(vl, containerClass);
35+
id appearance = [UIBarButtonItem appearanceWhenContainedIn:containerClass, nil];
36+
va_end(vl);
37+
[UIBarButtonItem configureItemOrProxy:appearance forFlatButtonWithColor:color highlightedColor:color cornerRadius:cornerRadius];
38+
}
39+
40+
- (void) removeTitleShadow {
41+
NSMutableDictionary *titleTextAttributes = [[self titleTextAttributesForState:UIControlStateNormal] mutableCopy];
42+
if (!titleTextAttributes) {
43+
titleTextAttributes = [NSMutableDictionary dictionary];
44+
}
45+
[titleTextAttributes setValue:[NSValue valueWithUIOffset:UIOffsetMake(0, 0)] forKey:UITextAttributeTextShadowOffset];
46+
[self setTitleTextAttributes:titleTextAttributes forState:UIControlStateNormal];
47+
}
48+
49+
//helper method, basically a wrapper to allow creating a custom UIAppearance method that doesn't conform to the usual naming style
50+
+ (void) configureItemOrProxy:(id)appearance
51+
forFlatButtonWithColor:(UIColor *)color
52+
highlightedColor:(UIColor *)highlightedColor
53+
cornerRadius:(CGFloat) cornerRadius {
6254
UIImage *backButtonPortraitImage = [UIImage backButtonImageWithColor:color
6355
barMetrics:UIBarMetricsDefault
6456
cornerRadius:cornerRadius];
@@ -72,8 +64,6 @@ + (void) configureFlatButtonsWithColor:(UIColor *) color
7264
barMetrics:UIBarMetricsLandscapePhone
7365
cornerRadius:2];
7466

75-
id appearance = [UIBarButtonItem appearanceWhenContainedIn:ContainerClass, nil];
76-
7767
[appearance setBackButtonBackgroundImage:backButtonPortraitImage
7868
forState:UIControlStateNormal
7969
barMetrics:UIBarMetricsDefault];
@@ -93,18 +83,7 @@ + (void) configureFlatButtonsWithColor:(UIColor *) color
9383
UIImage *buttonImage = [UIImage imageWithColor:color cornerRadius:cornerRadius];
9484
[appearance setBackgroundImage:buttonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
9585

96-
id toolbarAppearance = [UIBarButtonItem appearanceWhenContainedIn:ContainerClass, nil];
97-
[toolbarAppearance setBackgroundImage:[UIImage buttonImageWithColor:color cornerRadius:cornerRadius shadowColor:color shadowInsets:UIEdgeInsetsZero] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
98-
9986
}
10087

101-
- (void) removeTitleShadow {
102-
NSMutableDictionary *titleTextAttributes = [[self titleTextAttributesForState:UIControlStateNormal] mutableCopy];
103-
if (!titleTextAttributes) {
104-
titleTextAttributes = [NSMutableDictionary dictionary];
105-
}
106-
[titleTextAttributes setValue:[NSValue valueWithUIOffset:UIOffsetMake(0, 0)] forKey:UITextAttributeTextShadowOffset];
107-
[self setTitleTextAttributes:titleTextAttributes forState:UIControlStateNormal];
108-
}
10988

11089
@end

Example/FlatUIKitExample/ViewController.m

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,27 @@ - (void)viewDidLoad
4040
[super viewDidLoad];
4141
self.title = @"Flat UI";
4242
self.view.backgroundColor = [UIColor cloudsColor];
43-
[UIBarButtonItem configureFlatButtonsWithColor:[UIColor peterRiverColor] highlightedColor:[UIColor belizeHoleColor] cornerRadius:3];
43+
[UIBarButtonItem configureFlatButtonsWithColor:[UIColor peterRiverColor]
44+
highlightedColor:[UIColor belizeHoleColor]
45+
cornerRadius:3
46+
whenContainedIn:[UINavigationBar class], nil];
4447

4548
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Button"
4649
style:UIBarButtonItemStylePlain
4750
target:nil
4851
action:nil];
4952
[self.navigationItem.rightBarButtonItem removeTitleShadow];
5053

54+
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Button"
55+
style:UIBarButtonItemStylePlain
56+
target:nil
57+
action:nil];
58+
[self.navigationItem.rightBarButtonItem removeTitleShadow];
59+
60+
[self.navigationItem.leftBarButtonItem configureFlatButtonWithColor:[UIColor alizarinColor]
61+
highlightedColor:[UIColor pomegranateColor]
62+
cornerRadius:3];
63+
5164
self.alertViewButton.buttonColor = [UIColor turquoiseColor];
5265
self.alertViewButton.shadowColor = [UIColor greenSeaColor];
5366
self.alertViewButton.shadowHeight = 3.0f;

0 commit comments

Comments
 (0)