2012-09-20 32 views
3

我工作的自定義導航控制器的外觀在我的應用程序如下所示:自定義UINavigationBar的最慣用的iOS5方式?

enter image description here

正如我SO研究在幾個小時後發現,有一噸的不同這樣做的方式,有些非常黑客,有些則更不如此。我有興趣找到Apple實現這一目標的最有效/最優雅的方式,隨着應用程序的增長,這將導致最少的痛苦。到目前爲止我看過的一些方法:

1)我通過[UINavigationBar外觀]應用圖像更改了導航欄的背景/高度,似乎工作正常。

UIImage *navBarImage = [UIImage imageNamed:@"navigation-bar.png"]; 

[[UINavigationBar appearance] setBackgroundImage:navBarImage 
            forBarMetrics:UIBarMetricsDefault]; 

好像實現背景/高度變化的最「現代」的方式,但它最有可能撐不下去的方向變化。可以在這裏進行任何改進?

2)我更換了默認後退按鈕與在viewDidLoad中下面的推鑑於

// Set the custom back button 
UIImage *buttonImage = [UIImage imageNamed:@"back.png"]; 

//create the button and assign the image 
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
[button setImage:buttonImage forState:UIControlStateNormal]; 

//set the frame of the button to the size of the image (see note below) 
button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height); 

[button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; 

// offset the back button 
button.contentEdgeInsets = UIEdgeInsetsMake(10, 5, -10, -5); 

//create a UIBarButtonItem with the button as a custom view 
UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 
self.navigationItem.leftBarButtonItem = customBarItem; 

我不是很喜歡這種解決方案,因爲它離開酒吧的定製控制器在導航堆棧頂部。 From the Apple docs這似乎就像他們寧願你完全繼承了UINavigationBar的並更換了一次,所有的導航控制器:

您也可以通過使用initWithNavigationBarClass指定自定義UINavigationBar的子類:toolbarClass:方法初始化導航控制器。

這是建議的路線嗎?我無法通過[UIBarButtonItem外觀]替換UINavigationBar的默認後退按鈕,因爲它仍然嘗試顯示按鈕中的文本,並且當您刪除文本時,根本不顯示該按鈕。建議?

3)頁面標題應該可以通過navigationItem.titleView替換爲另一個視圖。有什麼更好的嗎?

謝謝!

回答

1

1)您應該爲兩個UIBarMetrics(UIBarMetricsDefault和UIBarMetricsLandscapePhone的單獨圖像)設置兩個圖像。因此

UIImage *navBarImage = [UIImage imageNamed:@"navigation-bar.png"]; 
UIImage *navBarImage_Landscape = [UIImage imageNamed:@"navigation-bar-landscape.png"]; 

[[UINavigationBar appearance] setBackgroundImage:navBarImage 
            forBarMetrics:UIBarMetricsDefault]; 
[[UINavigationBar appearance] setBackgroundImage:navBarImage_Landscape 
           forBarMetrics:UIBarMetricsLandscapePhone]; 

2)你可以繼承UINavigationBar(正如你已經提到的那樣,這將是默認的Apple方式)。或者如果它只是按鈕,也許你可以通過傳入「」(空文本)來破解它的行爲

3)不確定你的意思。你可以設置導航欄的標題,它會顯示你想要的任何標題。或者你應該能夠插入另一個視圖titleView

請注意,setBackgroundImage是iOS 5.0及更高版本。