当前位置:  开发笔记 > 前端 > 正文

如何使用UINavigationController的自定义视图创建backBarButtomItem

如何解决《如何使用UINavigationController的自定义视图创建backBarButtomItem》经验,为你挑选了6个好方法。

我有一个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];

感谢您的帮助.



1> memmons..:

从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/


如果您需要使用自定义视图,则不起作用.即如果您需要使后退按钮的大小或形状与默认值不同.如果你不需要这个是最容易的.

2> Travis..:

我很确定这backBarButtonItem是一个只读属性.而不是修改backBarButtonItem,尝试设置自定义leftBarButtonItem并隐藏backBarButtonItem:

self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Prout" style:UIBarButtonItemStyleDone target:nil action:nil] autorelease];
self.navigationItem.hidesBackButton = YES;

您还需要确保连接自定义按钮以调用后台操作UINavigationBar.


backBarButtonItem是*not*只读属性.我不确定为什么它表现得如此奇怪,以上是一个有效的(如果不是理想的)解决方法.
这不是一个错误.从文档 - >"配置栏按钮项时,不要为其指定自定义视图;导航项无论如何都会忽略后栏按钮中的自定义视图."
`leftBarButtonItem`不像后退按钮那样动画.当按下并弹出视图控制器时,它将在不水平移动的情况下褪色.
正如亚当所说,"backBarButtonItem"不是**只读.这不是一个理想的解决方法,但绝对可以接受.
我认为backBarButtonItem属性为任何*child*视图控制器中的后退按钮提供标签; 也就是说,弹出回到给定视图控制器的按钮的标签.
文档中的整个短语是,**如果要为后退按钮指定自定义图像或标题,则可以将自定义栏按钮项(使用自定义标题或图像)指定给此属性.配置条形按钮项时,不要为其指定自定义视图; 导航项无论如何都会忽略后栏按钮中的自定义视图.**因此,您可以在barButtonItem上使用自定义图像,您无法使用自定义视图.

3> Vivi..:

我从来没能用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];
    }
}


这个解决方案是正确的,但addTarget:call不是.在这种情况下,您将按钮操作设置为popViewControllerAnimated:由于目标/操作机制将传递单击的UIButton.popViewControllerAnimated:获取BOOL值.因此,转换是否是动画将是内存中分配按钮的位置的副作用以及Apple如何实现popViewControllerAnimated:call(例如,他们是"if(animated)"还是"if(animated ==)是)".而是设置一个调用popToViewControllerAnimated的方法:YES.
我认为,这个解决方案(考虑到par的建议)对原始问题的答案比当前接受的答案更合适.它允许您实际使用自定义视图.

4> 小智..:

如果您的最终目标是简单地替换用于后退按钮的图像,则可以在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];


哦,天哪,谢谢你.这让我疯狂(因为我见过成功实现它的应用程序),并且您的解决方案完美无缺.对于其他任何人来说都是如此 - 设置自定义LEFT按钮和BACK按钮之间存在很大差异(主要是当按下/弹出视图控制器时后退按钮获得平滑的平移动画,其中左按钮只是淡入/淡出).

5> CIFilter..:

我愿意打赌,这是Apple的一个错误,因为我遇到了完全相同的问题.原因是我可以自定义UIBarButtonItem显示,但只有当我尝试使用该initWithCustomView:方法时.根据API,导航控制器在推送新视图控制器时检查以下内容:

    如果新的顶级视图控制器具有自定义左栏按钮项,则显示该项.要指定自定义左栏按钮项,请设置视图控制器导航项的leftBarButtonItem属性.

    如果顶级视图控制器没有自定义左栏按钮项,但前一个视图控制器的导航项在其backBarButtonItem属性中具有有效项,则导航栏将显示该项.

    如果任一视图控制器未指定自定义栏按钮项,则使用默认后退按钮,并将其标题设置为上一个视图控制器的title属性的值 - 即,视图控制器向下一级堆栈.(如果导航堆栈上只有一个视图控制器,则不显示后退按钮.)

我的情况(以及你的情况)是2.我指定的代码与你的完全相同(即创建一个UIButton,image为各种状态设置其属性,创建一个UIBarButtonItem,用它初始化它UIButton,然后将我当前的视图控制器的backBarButtonItem属性设置为UIBarButtonItem) ; 然而,当我稍后推动我的视图控制器时,我的导航控制器的左侧没有显示任何内容.奇怪的是,我可以单击"后退"按钮所在的位置,然后弹出视图控制器.

有趣的是,如果我UIBarButtonItem使用initWithTitle:style:target:action:方法而不是方法创建一个initWithCustomView:,它显示一个带有自定义标题的自定义按钮.此外,正如特拉维斯所说,使用该leftBarButtonItem物业可以正常工作.但是,我宁愿遵守认可的逻辑,通过为当前视图控制器指定"后退"按钮 - 稍后在按下新视图控制器时显示 - 而不是为下一个视图控制器创建左按钮可以说,它应该不关心与它之前的视图控制器有关的任何事情.: - \



6> SundayMonday..:

backBarButtonItem 使用navigationController推送viewController 之前设置.设置backBarButtonItemviewDidLoad不起作用.

说我有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.按钮的行为类似于后退按钮.


您正在使用图像创建"UIBarButtonItem",而不是使用自定义视图.不一样的事情.
推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有