我有一个UINavigationController
我推几个视图.在viewDidLoad
其中一个视图中,我想将其设置self.navigationItem.backBarButtonItem
为自定义视图(基于自定义图像).我不知道为什么,但似乎没有用.相反,我得到了标准的"后退"按钮.
UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 63, 30)]; [backButton setImage:[UIImage imageNamed:@"back_OFF.png"] forState:UIControlStateNormal]; [backButton setImage:[UIImage imageNamed:@"back_ON.png"] forState:UIControlStateSelected]; UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; self.navigationItem.backBarButtonItem = backButtonItem; [backButtonItem release]; [backButton release];
我测试了一个标准的标题,它的工作原理.上面的代码有什么问题?
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Prout" style:UIBarButtonItemStyleDone target:nil action:nil] autorelease];
感谢您的帮助.
从iOS5开始,我们有一种很好的新方法,可以使用UIAppearance协议定制几乎任何控件的外观,即[UIBarButtonItem appearance]
.外观代理允许您创建应用程序范围内的控件外观更改.下面是使用外观代理创建的自定义后退按钮的示例.
使用下面的示例代码创建一个后退按钮,其中包含正常和突出显示状态的自定义图像.从appDelegate中调用以下方法application:didFinishLaunchingWithOptions:
- (void) customizeAppearance { UIImage *i1 = [[UIImage imageNamed:@"custom_backButton_30px"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 6)]; UIImage *i2 = [[UIImage imageNamed:@"custom_backButton_24px"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 6)]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:i1 forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:i2 forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:i1 forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:i2 forState:UIControlStateHighlighted barMetrics:UIBarMetricsLandscapePhone]; }
这只是一个简单的例子.通常,您希望为正常和突出显示(按下)状态设置单独的图像.
如果您有兴趣自定义其他控件的外观,可以在此处找到一些很好的示例:http://ios.biomsoft.com/2011/10/13/user-interface-customization-in-ios-5/
我很确定这backBarButtonItem
是一个只读属性.而不是修改backBarButtonItem
,尝试设置自定义leftBarButtonItem
并隐藏backBarButtonItem
:
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Prout" style:UIBarButtonItemStyleDone target:nil action:nil] autorelease]; self.navigationItem.hidesBackButton = YES;
您还需要确保连接自定义按钮以调用后台操作UINavigationBar
.
我从来没能用UIBarButtonItem
自定义视图创建一个合适的视图setBackBarButtonItem
.
这是我发现的解决方案:让网UINavigationControllerDelegate
处理一切!这里的技巧是调用popViewControllerAnimated:
方法,viewController.navigationController
因此您不必创建任何自定义方法.
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if([navigationController.viewControllers count ] > 1) { UIView *backButtonView = [[UIView alloc] initWithFrame:CGRectMake(0,0,70,35)]; UIButton *myBackButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain]; [myBackButton setFrame:CGRectMake(0,0,70,35)]; [myBackButton setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal]; [myBackButton setEnabled:YES]; [myBackButton addTarget:viewController.navigationController action:@selector(popViewControllerAnimated:) forControlEvents:UIControlEventTouchUpInside]; [backButtonView addSubview:myBackButton]; [myBackButton release]; UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithCustomView:backButtonView]; viewController.navigationItem.leftBarButtonItem = backButton; [backButtonView release]; [backButton release]; } }
如果您的最终目标是简单地替换用于后退按钮的图像,则可以在iOS 5.0中使用的UIBarButtonItem上使用新方法:
setBackButtonBackgroundImage:forState:barMetrics:
Apple Docs:http: //developer.apple.com/library/ios/#documentation/UIKit/Reference/UIBarButtonItem_Class/Reference/Reference.html
这是一个简单的示例,为应用中的所有后退按钮设置自定义背景图像:
UIImage *toolbarBackButtonBackgroundPortrait = [[UIImage imageNamed:@"toolbarBackButtonPortrait"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 17, 0, 6)]; UIImage *toolbarBackButtonBackgroundLandscape = [[UIImage imageNamed:@"toolbarBackButtonLandscape"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 17, 0, 6)]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:toolbarBackButtonBackgroundPortrait forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:toolbarBackButtonBackgroundLandscape forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone];
我愿意打赌,这是Apple的一个错误,因为我遇到了完全相同的问题.原因是我可以自定义UIBarButtonItem
显示,但只有当我不尝试使用该initWithCustomView:
方法时.根据API,导航控制器在推送新视图控制器时检查以下内容:
如果新的顶级视图控制器具有自定义左栏按钮项,则显示该项.要指定自定义左栏按钮项,请设置视图控制器导航项的leftBarButtonItem属性.
如果顶级视图控制器没有自定义左栏按钮项,但前一个视图控制器的导航项在其backBarButtonItem属性中具有有效项,则导航栏将显示该项.
如果任一视图控制器未指定自定义栏按钮项,则使用默认后退按钮,并将其标题设置为上一个视图控制器的title属性的值 - 即,视图控制器向下一级堆栈.(如果导航堆栈上只有一个视图控制器,则不显示后退按钮.)
我的情况(以及你的情况)是2.我指定的代码与你的完全相同(即创建一个UIButton
,image
为各种状态设置其属性,创建一个UIBarButtonItem
,用它初始化它UIButton
,然后将我当前的视图控制器的backBarButtonItem
属性设置为UIBarButtonItem
) ; 然而,当我稍后推动我的视图控制器时,我的导航控制器的左侧没有显示任何内容.奇怪的是,我可以单击"后退"按钮所在的位置,然后弹出视图控制器.
有趣的是,如果我UIBarButtonItem
使用initWithTitle:style:target:action:
方法而不是方法创建一个initWithCustomView:
,它会显示一个带有自定义标题的自定义按钮.此外,正如特拉维斯所说,使用该leftBarButtonItem
物业可以正常工作.但是,我宁愿遵守认可的逻辑,通过为当前视图控制器指定"后退"按钮 - 稍后在按下新视图控制器时显示 - 而不是为下一个视图控制器创建左按钮可以说,它应该不关心与它之前的视图控制器有关的任何事情.: - \
backBarButtonItem
在使用navigationController推送viewController 之前设置.设置backBarButtonItem
在viewDidLoad
不起作用.
说我有MyTableViewController.当用户点击特定行时,我想使用navigationController推送AnotherViewController.代码看起来像这样:
// in MyTableViewController's tableView:didSelectRowAtIndexPath method... UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"yourImage.png"] style:UIBarButtonItemStyleBordered target:nil action:nil]; self.navigationItem.backBarButtonItem = backButton; [backButton release]; [self.navigationController pushViewController:anotherViewController];
当显示anotherViewController时,导航栏中的后退按钮将具有@"yourImage.png"
默认的后退按钮样式(矩形箭头).还要注意,传递它nil
可以target
.按钮的行为类似于后退按钮.