2011-06-17 51 views
1

我在Custom background for UINavigationBar problems發佈的答案後成功實現了具有自定義背景的導航欄。UINavigationBar上的類別 - 僅適用於某些控制器

但是,我想有一些我的控制器的標準導航欄,我不知道如何實現這一點。

如果我基於基於導航的應用程序模板啓動一個新項目,並將UINavigationBar類別添加到單獨的.h和.m文件中,則會立即應用此類別。不包括或不必要的。這個怎麼用?

感謝您的幫助!

+0

正如@deanWombourne指出的,最簡單的解決方案是編寫一個子類而不是一個類,在我的情況下,這是一個有效的解決方案。不過,我仍然想了解類別的性質,以及爲什麼我的UINavigationBar類別會自動應用到我的xib文件中的每個導航欄。謝謝! – Reinhold 2011-06-17 12:49:29

回答

1

這裏有一個快速的黑客 - 用你的導航欄的標籤屬性來打開自定義代碼即

@implementation UINavigationBar (UINavigationBarCategory) 

- (void)drawRect:(CGRect)rect { 
    if (tag < 500) { 
     // Drawing code 
     UIImage *img = [UIImage imageNamed: @"navbar_background.png"]; 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage); 
    } else { 
     // Do the default drawing 
    } 
} 
@end 

現在,用了不到500標籤導航控制器上使用您的自定義背景。如果您將標籤設置爲> 500,您將獲得默認行爲。


編輯

由於@MikeWeller正確地指出,我們沒有獲得初步實現drawRect中,我們的類別有覆蓋它。

看看this link一個解決方案 - 基本上,這是一個宏,可包括,給你一個額外的方法:

@implementation UINavigationBar (UINavigationBarCategory) 

- (void)drawRect:(CGRect)rect { 
    if (tag < 500) { 
     // Drawing code 
     UIImage *img = [UIImage imageNamed: @"navbar_background.png"]; 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage); 
    } else { 
     // Do the default drawing 
     invokeSupersequent(rect); 
    } 
} 
@end 

NB我還沒有這個嘗試自己,但使用過的其他物品從這個博客以前取得了巨大的成功,所以我相信它:)讓我們知道你如何繼續!因爲蘋果已經改變UINavigationBar的實施使而是創建UINavigationBar的一個子類,並覆蓋的方法有,而不是創建類別

+0

問題是,如果你已經用類別方法覆蓋它,沒有辦法訪問原始的drawRect實現。這是您需要使用方法調整的地方。 – 2011-06-17 12:05:38

+0

@MikeWeller - 好點 - 我正在修改我的答案:) – deanWombourne 2011-06-17 12:09:30

0
@implementation UINavigationBar (UINavigationBarCategory) 

- (void)drawRect:(CGRect)rect { 
    if (tag < 500) { 
     // Drawing code 
     UIImage *img = [UIImage imageNamed: @"navbar_background.png"]; 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage); 
    } else { 
     // Do the default drawing 
    } 
} 
@end 

Remeber這種方法不會在安裝iOS 5.0的工作。

相關問題