Skip to content

Commit

Permalink
dramatically improve uibarbuttonitem appearance customization
Browse files Browse the repository at this point in the history
  • Loading branch information
jflinter committed May 24, 2013
1 parent 7fbd17a commit d797840
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 56 deletions.
15 changes: 12 additions & 3 deletions Classes/ios/UIBarButtonItem+FlatUI.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,24 @@

@interface UIBarButtonItem (FlatUI)

// styles a single bar button item
- (void) configureFlatButtonWithColor:(UIColor *)color
highlightedColor:(UIColor *)highlightedColor
cornerRadius:(CGFloat) cornerRadius UI_APPEARANCE_SELECTOR;

// styles all bar button items that exist within a class heirarchy (same as UIAppearanceProxy methods)
+ (void) configureFlatButtonsWithColor:(UIColor *) color
highlightedColor:(UIColor *)highlightedColor
cornerRadius:(CGFloat) cornerRadius;
cornerRadius:(CGFloat) cornerRadius
whenContainedIn:(Class <UIAppearanceContainer>)containerClass, ... NS_REQUIRES_NIL_TERMINATION;

// styles all bar button items (can be overwritten with the above methods)
+ (void) configureFlatButtonsWithColor:(UIColor *) color
highlightedColor:(UIColor *)highlightedColor
cornerRadius:(CGFloat) cornerRadius
whenContainedIn:(Class <UIAppearanceContainer>)ContainerClass;
cornerRadius:(CGFloat) cornerRadius;


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

@end
83 changes: 31 additions & 52 deletions Classes/ios/UIBarButtonItem+FlatUI.m
Original file line number Diff line number Diff line change
Expand Up @@ -11,54 +11,46 @@

@implementation UIBarButtonItem (FlatUI)

- (void) configureFlatButtonWithColor:(UIColor *)color
highlightedColor:(UIColor *)highlightedColor
cornerRadius:(CGFloat) cornerRadius {

[UIBarButtonItem configureItemOrProxy:self forFlatButtonWithColor:color highlightedColor:color cornerRadius:cornerRadius];

}

+ (void) configureFlatButtonsWithColor:(UIColor *) color
highlightedColor:(UIColor *)highlightedColor
cornerRadius:(CGFloat) cornerRadius {

UIImage *backButtonPortraitImage = [UIImage backButtonImageWithColor:color
barMetrics:UIBarMetricsDefault
cornerRadius:cornerRadius];
UIImage *highlightedBackButtonPortraitImage = [UIImage backButtonImageWithColor:highlightedColor
barMetrics:UIBarMetricsDefault
cornerRadius:cornerRadius];
UIImage *backButtonLandscapeImage = [UIImage backButtonImageWithColor:color
barMetrics:UIBarMetricsLandscapePhone
cornerRadius:2];
UIImage *highlightedBackButtonLandscapeImage = [UIImage backButtonImageWithColor:highlightedColor
barMetrics:UIBarMetricsLandscapePhone
cornerRadius:2];

id appearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], [UINavigationController class], nil];

[appearance setBackButtonBackgroundImage:backButtonPortraitImage
forState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
[appearance setBackButtonBackgroundImage:backButtonLandscapeImage
forState:UIControlStateNormal
barMetrics:UIBarMetricsLandscapePhone];
[appearance setBackButtonBackgroundImage:highlightedBackButtonPortraitImage
forState:UIControlStateHighlighted
barMetrics:UIBarMetricsDefault];
[appearance setBackButtonBackgroundImage:highlightedBackButtonLandscapeImage
forState:UIControlStateHighlighted
barMetrics:UIBarMetricsLandscapePhone];

[appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(1.0f, 1.0f) forBarMetrics:UIBarMetricsDefault];
[appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(1.0f, 1.0f) forBarMetrics:UIBarMetricsLandscapePhone];

UIImage *buttonImage = [UIImage imageWithColor:color cornerRadius:cornerRadius];
[appearance setBackgroundImage:buttonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

id toolbarAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil];
[toolbarAppearance setBackgroundImage:[UIImage buttonImageWithColor:color cornerRadius:cornerRadius shadowColor:color shadowInsets:UIEdgeInsetsZero] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self configureFlatButtonsWithColor:color highlightedColor:highlightedColor cornerRadius:cornerRadius whenContainedIn:[UINavigationBar class], [UINavigationController class], nil];
}

+ (void) configureFlatButtonsWithColor:(UIColor *) color
highlightedColor:(UIColor *)highlightedColor
cornerRadius:(CGFloat) cornerRadius
whenContainedIn:(Class <UIAppearanceContainer>)ContainerClass
{

whenContainedIn:(Class <UIAppearanceContainer>)containerClass, ... {
va_list vl;
va_start(vl, containerClass);
id appearance = [UIBarButtonItem appearanceWhenContainedIn:containerClass, nil];
va_end(vl);
[UIBarButtonItem configureItemOrProxy:appearance forFlatButtonWithColor:color highlightedColor:color cornerRadius:cornerRadius];
}

- (void) removeTitleShadow {
NSMutableDictionary *titleTextAttributes = [[self titleTextAttributesForState:UIControlStateNormal] mutableCopy];
if (!titleTextAttributes) {
titleTextAttributes = [NSMutableDictionary dictionary];
}
[titleTextAttributes setValue:[NSValue valueWithUIOffset:UIOffsetMake(0, 0)] forKey:UITextAttributeTextShadowOffset];
[self setTitleTextAttributes:titleTextAttributes forState:UIControlStateNormal];
}

//helper method, basically a wrapper to allow creating a custom UIAppearance method that doesn't conform to the usual naming style
+ (void) configureItemOrProxy:(id)appearance
forFlatButtonWithColor:(UIColor *)color
highlightedColor:(UIColor *)highlightedColor
cornerRadius:(CGFloat) cornerRadius {
UIImage *backButtonPortraitImage = [UIImage backButtonImageWithColor:color
barMetrics:UIBarMetricsDefault
cornerRadius:cornerRadius];
Expand All @@ -72,8 +64,6 @@ + (void) configureFlatButtonsWithColor:(UIColor *) color
barMetrics:UIBarMetricsLandscapePhone
cornerRadius:2];

id appearance = [UIBarButtonItem appearanceWhenContainedIn:ContainerClass, nil];

[appearance setBackButtonBackgroundImage:backButtonPortraitImage
forState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
Expand All @@ -93,18 +83,7 @@ + (void) configureFlatButtonsWithColor:(UIColor *) color
UIImage *buttonImage = [UIImage imageWithColor:color cornerRadius:cornerRadius];
[appearance setBackgroundImage:buttonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

id toolbarAppearance = [UIBarButtonItem appearanceWhenContainedIn:ContainerClass, nil];
[toolbarAppearance setBackgroundImage:[UIImage buttonImageWithColor:color cornerRadius:cornerRadius shadowColor:color shadowInsets:UIEdgeInsetsZero] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

}

- (void) removeTitleShadow {
NSMutableDictionary *titleTextAttributes = [[self titleTextAttributesForState:UIControlStateNormal] mutableCopy];
if (!titleTextAttributes) {
titleTextAttributes = [NSMutableDictionary dictionary];
}
[titleTextAttributes setValue:[NSValue valueWithUIOffset:UIOffsetMake(0, 0)] forKey:UITextAttributeTextShadowOffset];
[self setTitleTextAttributes:titleTextAttributes forState:UIControlStateNormal];
}

@end
15 changes: 14 additions & 1 deletion Example/FlatUIKitExample/ViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,27 @@ - (void)viewDidLoad
[super viewDidLoad];
self.title = @"Flat UI";
self.view.backgroundColor = [UIColor cloudsColor];
[UIBarButtonItem configureFlatButtonsWithColor:[UIColor peterRiverColor] highlightedColor:[UIColor belizeHoleColor] cornerRadius:3];
[UIBarButtonItem configureFlatButtonsWithColor:[UIColor peterRiverColor]
highlightedColor:[UIColor belizeHoleColor]
cornerRadius:3
whenContainedIn:[UINavigationBar class], nil];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Button"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
[self.navigationItem.rightBarButtonItem removeTitleShadow];

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Button"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
[self.navigationItem.rightBarButtonItem removeTitleShadow];

[self.navigationItem.leftBarButtonItem configureFlatButtonWithColor:[UIColor alizarinColor]
highlightedColor:[UIColor pomegranateColor]
cornerRadius:3];

self.alertViewButton.buttonColor = [UIColor turquoiseColor];
self.alertViewButton.shadowColor = [UIColor greenSeaColor];
self.alertViewButton.shadowHeight = 3.0f;
Expand Down

0 comments on commit d797840

Please sign in to comment.