UINavigationItem leftBarButton隐藏在它的背景之后

时间:2011-04-05 06:34:02

标签: cocoa-touch uinavigationcontroller uinavigationbar uinavigationitem

我有一个带有自定义背景和我自己的后退按钮的UINavigationBar。我做了以下尝试实现这一点。

//custom background
UIImageView *background = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"navigation-bar.png"]] autorelease];
[self.navigationController.navigationBar insertSubview:background atIndex:0];

//custom back button
UIImage *buttonImage = [UIImage imageNamed:@"btn_back.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:buttonImage forState:UIControlStateNormal];
button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);
[button addTarget:self action:@selector(backPressed:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
self.navigationItem.leftBarButtonItem = customBarItem;
[customBarItem release];

后退按钮始终有效,但只有在我不应用自定义背景时才能看到它。有人可以指出如何实现这两个目标吗?

提前致谢。 瑞奇。

2 个答案:

答案 0 :(得分:1)

您可以使用此

设置导航栏的背景图像
@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{
    if([self isMemberOfClass:[UINavigationBar class]])
    {
        UIImage *image;


        image=[UIImage imageNamed:@"nav_bar_img"];


        CGContextClip(ctx);
        CGContextTranslateCTM(ctx, 0, image.size.height);
        CGContextScaleCTM(ctx, 1.0, -1.0);
        CGContextDrawImage(ctx,
                           CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage); 
    }
    else 
    {        
        [super drawLayer:layer inContext:ctx];     
    }
}  
@end

答案 1 :(得分:0)

我最终做了以下事情。

@implementation UINavigationBar (Category)

- (void)drawRect:(CGRect)rect
{
    MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
    [delegate.navImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

@end

每次我想更改栏的背景时,我都会更改委托的navImage属性并在导航栏上调用-setNeedsDisplay

感谢您的帮助。