UINavigationBar和后退button的自定义

我按照下面的教程来定制UINavigationBar。

http://foobarpig.com/iphone/uinavigationbar-with-solid-color-or-image-background.html

我在UINavigationBar中应用了一个背景图片,但是,我不知道如何自定义后退button。 目前,默认后退button不适合自定义UINavigationBar的外观和风格。

请教我如何更改默认后退button的背景颜色或图像。 谢谢。

在这里输入图像说明

我写了以下类别来自定义后退button:

的UIBarButtonItem + StyledButton.h

@interface UIBarButtonItem (StyledButton) + (UIBarButtonItem *)styledBackBarButtonItemWithTarget:(id)target selector:(SEL)selector; + (UIBarButtonItem *)styledCancelBarButtonItemWithTarget:(id)target selector:(SEL)selector; + (UIBarButtonItem *)styledSubmitBarButtonItemWithTitle:(NSString *)title target:(id)target selector:(SEL)selector; @end 

的UIBarButtonItem + StyledButton.m

 @implementation UIBarButtonItem (StyledButton) + (UIBarButtonItem *)styledBackBarButtonItemWithTarget:(id)target selector:(SEL)selector; { UIImage *image = [UIImage imageNamed:@"button_back"]; image = [image stretchableImageWithLeftCapWidth:20.0f topCapHeight:20.0f]; NSString *title = NSLocalizedString(@"Back", nil); UIFont *font = [UIFont boldSystemFontOfSize:12.0f]; UIButton *button = [UIButton styledButtonWithBackgroundImage:image font:font title:title target:target selector:selector]; button.titleLabel.textColor = [UIColor blackColor]; CGSize textSize = [title sizeWithFont:font]; CGFloat margin = (button.frame.size.height - textSize.height) / 2; CGFloat marginRight = 7.0f; CGFloat marginLeft = button.frame.size.width - textSize.width - marginRight; [button setTitleEdgeInsets:UIEdgeInsetsMake(margin, marginLeft, margin, marginRight)]; [button setTitleColor:[UIColor colorWithRed:53.0f/255.0f green:77.0f/255.0f blue:99.0f/255.0f alpha:1.0f] forState:UIControlStateNormal]; return [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease]; } + (UIBarButtonItem *)styledCancelBarButtonItemWithTarget:(id)target selector:(SEL)selector; { UIImage *image = [UIImage imageNamed:@"button_square"]; image = [image stretchableImageWithLeftCapWidth:20.0f topCapHeight:20.0f]; NSString *title = NSLocalizedString(@"Cancel", nil); UIFont *font = [UIFont boldSystemFontOfSize:12.0f]; UIButton *button = [UIButton styledButtonWithBackgroundImage:image font:font title:title target:target selector:selector]; button.titleLabel.textColor = [UIColor blackColor]; [button setTitleColor:[UIColor colorWithRed:53.0f/255.0f green:77.0f/255.0f blue:99.0f/255.0f alpha:1.0f] forState:UIControlStateNormal]; return [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease]; } + (UIBarButtonItem *)styledSubmitBarButtonItemWithTitle:(NSString *)title target:(id)target selector:(SEL)selector; { UIImage *image = [UIImage imageNamed:@"button_submit"]; image = [image stretchableImageWithLeftCapWidth:20.0f topCapHeight:20.0f]; UIFont *font = [UIFont boldSystemFontOfSize:12.0f]; UIButton *button = [UIButton styledButtonWithBackgroundImage:image font:font title:title target:target selector:selector]; button.titleLabel.textColor = [UIColor whiteColor]; [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; return [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease]; } 

的UIButton + StyledButton.h

 @interface UIButton (UIButton_StyledButton) + (UIButton *)styledButtonWithBackgroundImage:(UIImage *)image font:(UIFont *)font title:(NSString *)title target:(id)target selector:(SEL)selector; @end 

的UIButton + StyledButton.m

 @implementation UIButton (UIButton_StyledButton) + (UIButton *)styledButtonWithBackgroundImage:(UIImage *)image font:(UIFont *)font title:(NSString *)title target:(id)target selector:(SEL)selector { CGSize textSize = [title sizeWithFont:font]; CGSize buttonSize = CGSizeMake(textSize.width + 20.0f, image.size.width); UIButton *button = [[[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, buttonSize.width, buttonSize.height)] autorelease]; [button addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside]; [button setBackgroundImage:image forState:UIControlStateNormal]; [button setTitle:title forState:UIControlStateNormal]; [button.titleLabel setFont:font]; return button; } @end 

它很容易使用,例如:

 - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.leftBarButtonItem = [UIBarButtonItem styledBackBarButtonItemWithTarget:self selector:@selector(dismissModalViewController)]; self.navigationItem.rightBarButtonItem = [UIBarButtonItem styledSubmitBarButtonItemWithTitle:NSLocalizedString(@"Done", nil) target:self selector:@selector(doneButtonTouched:)]; } 

上面的代码是来自一个仍在进行中的项目,所以它可以被清理一下,但它的工作原理是一样的。 使用没有文字的图像作为button,并确保它们是可拉伸的 (即不要使图像太小,小心渐变)。 以下示例中的后退button图像仅为31 x 30像素,但是会拉长以使文本适合。

结果的一些例子:

返回键

在这里输入图像说明

取消/完成button

在这里输入图像说明

我已经使用了这个代码几次:

 - (void)viewDidLoad { [super viewDidLoad]; // Set the custom back button UIImage *buttonImage = [UIImage imageNamed:@"back_button.png"]; //create the button and assign the image UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; [button setImage:buttonImage forState:UIControlStateNormal]; //set the frame of the button to the size of the image (see note below) button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height); [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; //create a UIBarButtonItem with the button as a custom view UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; self.navigationItem.leftBarButtonItem = customBarItem; // Cleanup [customBarItem release]; } -(void)back { // Tell the controller to go back [self.navigationController popViewControllerAnimated:YES]; } 

从这个网站。 希望能帮助到你!

你必须build立一个自定义的UIButton并传递给UIBarButton的initWithCustomView。

这是你做的。

1)在Interface Builder中为导航项添加自定义button:

在这里输入图像说明

2)在代码中执行以下操作:

 #define IS_IOS7 ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; if (IS_IOS7) { [self shiftView:self.navigationItem.leftBarButtonItem.customView horizontallyBy:-11]; [self shiftView:self.navigationItem.rightBarButtonItem.customView horizontallyBy:11]; } } - (void)shiftView:(UIView*)view horizontallyBy:(int)offset { CGRect frame = view.frame; frame.origin.y += offset; view.frame = frame; }