2010-08-05 87 views
2

我一直在試圖找出如何在我的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. 我如何可以選擇顯示背景圖片或者是切換所選擇的屏幕的阿爾法?有一個特定的屏幕,其中有一個後退按鈕,它覆蓋了我不想要的圖像,我寧可不在該屏幕上顯示圖像。

  2. 圖像不是整個高度的UINavigationBar它只是它的一小部分(27,你可以看到)。如何使用這種技術爲酒吧的其他部分保留色調?

謝謝,我沒有用之前類別可能是關鍵,我理解這一點,但也許不是...

回答

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]); 

這是我畫我的自定義導航欄。希望有所幫助。

+0

確實有效!爲什麼你需要應用尺度和變換? – Mark 2010-08-05 09:56:52

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); 
} 

而且this complete demo Xcode project上定製UINavigationBar的外觀可能會有所幫助。