【问题标题】:Custom UINavigationBar button not displaying自定义 UINavigationBar 按钮不显示
【发布时间】:2010-12-23 00:35:13
【问题描述】:

(已编辑:在底部添加了更多信息)

首先,我浏览了类似的帖子并尝试了他们的答案,但没有运气:(我有一个自定义导航栏(只是一个自定义背景图像),我正在尝试添加一个自定义后退按钮。

// custom back button.
UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *backImg = [UIImage imageNamed:@"btn_back.png"];
backBtn.titleLabel.text = @"";
[backBtn setBackgroundImage:backImg forState:UIControlStateNormal];
[backBtn addTarget:self action:@selector(backPressed) forControlEvents:UIControlEventTouchUpInside];
backBtn.frame = CGRectMake(0, 0, 54, 33);

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backBtn];
self.navigationItem.leftBarButtonItem.title = @"";

上面的代码是用来添加按钮的,但它没有显示在导航栏上。我仍然可以单击它应该出现的区域,它确实让我回到以前的视图?!删除上面的代码会显示标准的后退按钮。

有什么想法吗?提前致谢!

(编辑)

大家好,

我尝试了您的所有建议,但仍然没有运气:(我可能应该在前面提到,我有一个使用以下代码的自定义导航栏图像。这可能会影响我的自定义后退按钮图像的显示。

此代码根据我设置的参数显示自定义图像。再次感谢您的进一步帮助!

// custom navigation bar image
@implementation UINavigationController (CustomImage)

// set the background image for the nav bar.
- (void) setCustomNavBar:(NSInteger)screen {

UIImage *navBarImg;
switch (screen) {
    case kCreateHuntScreenIdentifier:
        navBarImg = [UIImage imageNamed:@"title_create-hunt.png"];
        break;

    case kCreateLocationsScreenIdentifier:
        navBarImg = [UIImage imageNamed:@"title_create-location.png"];
        break;

    case kListNewLocationsScreenIdentifier:
        navBarImg = [UIImage imageNamed:@"title_choose-location.png"];
        break;

    default:
        break;
}

UIImageView *imgView = [[UIImageView alloc] initWithImage:navBarImg];
[[[self.navigationBar subviews] objectAtIndex:0] removeFromSuperview];
[self.navigationBar addSubview:imgView];
[imgView release];
}

@end

【问题讨论】:

  • 好的,如果我不为导航栏显示自定义图像,自定义后退按钮会显示!会尝试看看我是否让两者一起显示,如果我弄清楚发生了什么,我会在这里发布更新!

标签: iphone uibutton uinavigationbar


【解决方案1】:

再次感谢您的所有建议!我终于找到了解决方案:D

当我推入或弹出堆栈时,我很快需要能够将导航栏的背景图像从一个视图更改为另一个视图。

使用最流行的方法,例如覆盖 UINavigationBar 的 drawRect 只能部分工作,它会在根视图上工作,但然后将图像推送到导航栏堆栈的前面,无论我是否将其发送到其他屏幕背面等。

我在这里找到了解决方案:http://sebastiancelis.com/2009/12/21/adding-background-image-uinavigationbar/

读一读,效果很好:)

【讨论】:

  • 只是一个更新,因为这篇文章已经有一年多了,随着 iOS5 的推出,Apple 建议您将 UINavigationBar 子类化为自定义背景。
  • 非常感谢。我正在开发一个需要支持 iOS 5 和 iOS 4.3 的应用程序,这正是我想要的。对于 iOS5,我使用这个 [self.navigationController.navigationBar setBackgroundImage:navBarBackgroundImage forBarMetrics:UIBarMetricsDefault];
【解决方案2】:
UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
[btn setBackgroundImage:[UIImage imageNamed:@"imgname.png"] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(method_name:) forControlEvents:UIControlEventTouchUpInside];
btn.frame=CGRectMake(3, 2, 53, 30);
UIBarButtonItem *btnBack=[[UIBarButtonItem alloc] initWithCustomView:btn];
self.navigationItem.leftBarButtonItem=btnBack;
[btnBack release];
[btn release];

【讨论】:

  • 在 viewDidLoad 方法中使用这个
  • 是的,这是您需要定义 UIBarButtonItem 并首先分配它们的正确答案。此外,您还可以查看一些自定义实现,然后将按钮子视图添加到 View。然后分配 UIBarButton 项您设计的自定义视图....并按照上述回答的过程进一步
  • 感谢 dks1725 和 sabby,但恐怕这对我不起作用 :( 我猜这一定与我设置自定义导航栏背景图像的方式有关,所以我包括了我的编辑中的代码。请注意,如果我省略了自定义按钮图像,则默认按钮图像将正常显示:/
  • 为什么要用[btn release]; ?很丰富。
【解决方案3】:

试试,

self.navigationItem.hidesBackButton = YES;

在为 .leftBarButtonItem 编写代码之前。希望对您有所帮助

【讨论】:

  • 感谢 Swastik 但也没有运气:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 2013-03-12
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多