我有一个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];
Run Code Online (Sandbox Code Playgroud)
我测试了一个标准的标题,它的工作原理.上面的代码有什么问题?
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Prout" style:UIBarButtonItemStyleDone target:nil action:nil] autorelease];
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助.
mem*_*ons 27
从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];
}
Run Code Online (Sandbox Code Playgroud)
这只是一个简单的例子.通常,您希望为正常和突出显示(按下)状态设置单独的图像.
如果您有兴趣自定义其他控件的外观,可以在此处找到一些很好的示例:http://ios.biomsoft.com/2011/10/13/user-interface-customization-in-ios-5/
Tra*_*vis 19
我很确定这backBarButtonItem是一个只读属性.而不是修改backBarButtonItem,尝试设置自定义leftBarButtonItem并隐藏backBarButtonItem:
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Prout" style:UIBarButtonItemStyleDone target:nil action:nil] autorelease];
self.navigationItem.hidesBackButton = YES;
Run Code Online (Sandbox Code Playgroud)
您还需要确保连接自定义按钮以调用后台操作UINavigationBar.
Viv*_*ivi 15
我从来没能用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];
}
}
Run Code Online (Sandbox Code Playgroud)
小智 10
如果您的最终目标是简单地替换用于后退按钮的图像,则可以在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];
Run Code Online (Sandbox Code Playgroud)
我愿意打赌,这是Apple的一个错误,因为我遇到了完全相同的问题.原因是我可以自定义UIBarButtonItem显示,但只有当我不尝试使用该initWithCustomView:方法时.根据API,导航控制器在推送新视图控制器时检查以下内容:
我的情况(以及你的情况)是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];
Run Code Online (Sandbox Code Playgroud)
当显示anotherViewController时,导航栏中的后退按钮将具有@"yourImage.png"默认的后退按钮样式(矩形箭头).还要注意,传递它nil可以target.按钮的行为类似于后退按钮.
| 归档时间: |
|
| 查看次数: |
50850 次 |
| 最近记录: |