iPhone UINavigationBar自定义外观

时间:2010-08-05 06:01:30

标签: iphone uinavigationbar

我一直试图弄清楚如何在我的iPhone应用程序的UINavigationBar后面显示背景图像,并且多次遇到相同的解决方案,如下所示:

@implementation UINavigationBar (UINavigationBarCategory) {
    - (void)drawRect:(CGRect)rect {
         UIImage *img = [UIImage imageNamed: @"logo_bar.png"];
         CGContextRef context = UIGraphicsGetCurrentContext();
         CGContextDrawImage(context, CGRectMake(0, 0, 317, 27), img.CGImage);
}
@end

哪种程度有效

我的图片倒置和倒退 !!那到底为什么会这样?我检查了图像本身,这很好。这个转换将在哪里应用?

我还有其他问题,例如:

  1. 如何选择显示BG图像或者在所选屏幕上切换其alpha?有一个特殊的屏幕,其中有一个后退按钮,它覆盖了我不想要的图像,我宁愿不在该屏幕上显示图像。

  2. 图像不是UINavigationBar的整个高度,只是它的一小部分(你可以看到27)。如何使用这种技术保留酒吧其余部分的色调?

  3. 谢谢,我之前没有使用过类别可能是我理解这一点的关键,但也许不是......

2 个答案:

答案 0 :(得分:2)

// Drawing code
CGContextRef c = UIGraphicsGetCurrentContext();

UIImage *back=[UIImage imageNamed:@"bar.png"];

CGContextScaleCTM(c,1,-1);
CGContextTranslateCTM(c,0,-44);

CGContextDrawImage(c,CGRectMake(0, 0, 320, 44),[back CGImage]);

这是我绘制自定义导航栏的方式。希望有所帮助。

答案 1 :(得分:0)

您也可以在UINavigationBar类别类的 drawLayer:inContext:方法中执行此操作。在 drawLayer:inContext:方法中,您可以绘制要使用的背景图像。此代码还支持纵向和横向。

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
        return;
    }

    UIImage *image = (self.frame.size.width > 320) ?
                        [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
    CGContextClip(context);
    CGContextTranslateCTM(context, 0, image.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}

关于自定义UINavigationBar外观的this complete demo Xcode project可能会有所帮助。