2010-02-08 59 views
1

在「黑色半透明」UINavigationBar下有一個自定義UIImageView,但我對結果並不滿意。自定義圖像不夠明顯,並且在更改導航欄alpha值時會使其更易於看到,導致導航欄標題和按鈕不易被看到。透明導航條下的自定義背景

問題:我想要一個完全可見的自定義UINavigationBar背景圖像,帶有完全可見的小節標題和按鈕。任何想法我怎麼會得到這一切?

更新:我的解決方案與這些答案類似,但有點不同。不想接受我自己的答案,因此在iLessons iLearned上發表了博文(link)。

+0

我可以使用UILabel的「文本可見,背景透明」,但仍然需要按鈕... – JOM 2010-02-08 06:55:16

回答

1

您也可以創建一個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的thisthis的外觀可能會有所幫助一個完整的演示Xcode項目。

+1

我的解決方案是其他的東西,但這是類似的,我接受這是正確的答案(對我來說)。 – JOM 2011-09-20 23:41:36

+0

此方法在iOS5中不起作用。 – Andrea 2011-09-21 07:24:05

3

我想自定義UINavigationBar的背景圖片也一樣,並最終通過解決它:

  • 在的UINavigationController的初始化,我創建了一個CALayer的是有contents設置爲背景圖片,並設置相應的幀。
  • 我添加了層到UINavigationBar的的層(索引0,在背景中):[self.navigationBar.layer insertSublayer:imageLayer atIndex:0]

在這一點上,它看起來起初還好,但如果你做任何的導航,標籤和按鈕消失的背後'背景'層。所以,

  • 我創建了一個CALayer的子類,它改變了insertSublayer:atIndex:的行爲,以便在背景層下面不插入圖層。

像這樣:

@implementation CTNavigationBarLayer 
- (void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx { 
    if (idx == 0) idx = 1; 
    [super insertSublayer:layer atIndex:idx]; 
} 
- (void)addBackgroundLayer:(CALayer*)layer { 
    [super insertSublayer:layer atIndex:0]; 
} 
@end 
  • 使用上UINavigationBar的一個類別,我重載+layerClass方法返回[CTNavigationBar class],所以導航欄使用自定義層。

當然,這改變了所有 UINavigationBars的行爲在您的應用程序,因此,如果這是不是你想要的,你會想尋求的另一種方法。你可以繼承UINavigationBar的,但後來只有這樣,才能在一個UINavigationController使用該子類是通過IB(或做一些相當有趣mucking about做編程)

  • 最後,早在UINavigationController的初始化,我通過調用我寫的addBackgroundLayer:方法替換了圖層插入。
0

如果你有多個UINavigationController,比如在UITabBar中,因爲它使用了UINavigationBar類別,每個UINavigationBar都需要不同的背景,ardalahmet解決方案就不對了。

2

在UINavigationBar類別中使用drawRect在iOS5中不起作用。 Apple建議的方式是創建UINavigationBar的子類並在您的NIB文件中使用它。

2

爲了讓人們在這裏稍晚一點的好處,值得注意的是,iOS5爲這種定製提供了直接支持。要改變形象UINavigationBar的底層,使用

- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics 

還有調整的稱號屬性

@property(nonatomic, copy) NSDictionary *titleTextAttributes 

。而且您可以使用外觀代理來在您的應用中普遍使用這些更改。在WWDC 2011會議114「定製UIKit控件的外觀」中進行更多討論。

在iOS5之前,你應該這樣做的方式是通過繼承UINavigationBar。