2011-05-06 231 views
2

希望你也可以幫助這個... 我想通過添加自定義背景圖片來自定義我的導航欄。我發現了一個完美的但有點複雜的方法:NavigationSwizzle。在以前的項目中,我的工作沒有任何嚴重的問題,但現在我卡住...定製導航欄隱藏按鈕

從我的AppDelegate我打電話這種靜態方法:調用秒鐘後

@implementation SCAppUtils 
+ (void)customizeNavigationController:(UINavigationController *)navController 
{ 
//Customizing navigation BAR 
UINavigationBar *navBar = [navController navigationBar]; 
[navBar setTintColor:kSCNavBarColor]; 

//Customizing TOOLBAR 
[navController setToolbarHidden:NO animated:YES]; 

UIToolbar *toolBar = [navController toolbar]; 

UIImageView *imageView = (UIImageView *)[navBar viewWithTag:kSCNavBarImageTag]; 
UIImageView *imageView2 = (UIImageView *)[toolBar viewWithTag:kSCNavBarImageTag]; 

if (imageView == nil) 
{ 
    Utilities *utilities = [[Utilities alloc]init]; 

    UIImage *img = [UIImage imageNamed:@"nav-bar-background.png"]; 
    UIImage *img2 = [UIImage imageNamed:@"toolbar-background.png"]; 

    imageView = [[UIImageView alloc] initWithImage:img]; 
    imageView2 = [[UIImageView alloc] initWithImage:img2]; 

    [imageView setTag:kSCNavBarImageTag]; 
    [imageView2 setTag:kSCNavBarImageTag]; 

    [navBar insertSubview:imageView atIndex:0]; 
    [toolBar insertSubview:imageView2 atIndex:0]; 

    [imageView release]; 
    [imageView2 release]; 
    [utilities release]; 

} 

}

在rootNavigationController視圖控制器通過推動它在堆棧上我的右鍵,self.title,activityIndi​​cator不顯示。如果我評論或設置atIndex:-1 in line [navBar insertSubview:imageView atIndex:0];然後按鈕顯示,但我的自定義背景消失,我得到常規的iPhone導航選項卡。

didSelectRowAtIndexrootNavigationController的我:

//ADD BACK BUTTON TO VIEW 
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Home" style:UIBarButtonItemStyleDone target:nil action:nil]; 
self.navigationItem.backBarButtonItem = backButton; 

//Home Button color 
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:166.0/255 green:179.0/255 blue:191.0/255 alpha:1.0]; 

//PUSH TO NEXT VIEW 
[self.navigationController pushViewController:detailViewController animated:YES]; 

預先感謝您...

如果你需要更多的代碼或解釋,請不要猶豫,問我。 ..

最好的問候, 盧卡

編輯:

好的,我可以讓這個問題更簡單。我在導航欄中有一個自定義背景圖片。該圖像顯然是覆蓋我

self.navigationItem.title = @"TITLE"; 

如果我把阿爾法:ImageView的是在後臺的0.3我可以看到我的標題:

imageView = [[UIImageView alloc] initWithImage:image]; 
[imageView setAlpha:0.3]; 
[imageView setTag:kSCNavBarImageTag]; 
[navBar insertSubview:imageView atIndex:0]; 

所以,問題是我怎麼可以把我的navigationItem 。標題前面?它是UIView類的後代嗎?

編輯2: 真正奇怪的是,標題是可見的(上面的背景圖片)在rootController但另一個推的viewController冠軍後,進入後面TE背景ImageView的?!

+0

您是否已經解決了此問題? – miya 2011-12-28 23:54:08

回答

0

您可能想試試這個來自定義您的導航欄。我在我的應用程序中使用它,它的作用就像一個魅力

UIImage *theImage = [UIImage imageNamed:@"barImage.png"]; 
[self.navigationController.navigationBar insertSubview:[[[UIImageView alloc] initWithImage:theImage] autorelease] atIndex:0]; 

看看是否可以解決您的問題與按鈕不出現。

+0

感謝您的回答,但子查看是我想要避免的,因爲我希望我的導航欄更加靈活,以便可以採用例如在點擊打開Safari時設置的自定義按鈕......我擁有在我的情況下使用方法swizzling ...再次感謝 – luigi7up 2011-05-09 07:26:18

1

我真的認爲你忘了在main.m中添加這段代碼。你的main.m應該是這樣的:

#import <UIKit/UIKit.h> 
#import "AppDelegate.h" 
#import "SCClassUtils.h" 

int main(int argc, char *argv[]) 
{ 
    [SCClassUtils swizzleSelector:@selector(insertSubview:atIndex:) 
          ofClass:[UINavigationBar class] 
        withSelector:@selector(scInsertSubview:atIndex:)]; 
    [SCClassUtils swizzleSelector:@selector(sendSubviewToBack:) 
          ofClass:[UINavigationBar class] 
        withSelector:@selector(scSendSubviewToBack:)]; 

    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
    } 
} 
+0

我希望我沒有回答這個太晚:) – 2012-02-02 00:45:31

0

我發現了一個solituion爲我的工作。使用符合導航欄的所有圖像和顏色創建視圖(viewBackground),然後將其轉換爲圖像並將其用作背景

UIGraphicsBeginImageContextWithOptions(viewBackground.bounds.size, viewBackground.opaque, 0.0); 
[viewBackground.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

[[UINavigationBar appearance]   setBackgroundImage:img forBarMetrics:UIBarMetricsDefault]; 
[self.navigationController.navigationBar setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];