7

這是什麼,我想實現的子類UINavigationBar的: NavigationBar 注:也有一個標題到控制器。如何正確使用也是外觀

一些額外的信息: -

  1. 該導航條將顯示在約10視圖控制器。
  2. 它不是導航控制器的一部分,以能夠不是必需的。
  3. 左邊的按鈕是靜態的(始終是導航欄上)。
  4. 右邊的按鈕是不是靜態的,要麼不存在,或者是 在不同的視圖控制器不同。
  5. 左邊的按鈕充當滑動菜單(在下方即菜單幻燈片左起)
  6. 我在安裝使用故事板

問題 什麼是實現這一目標的正確方法是什麼?

現有代碼 我試圖實現這一點,但我只能得到一個或另一個按鈕,沒有標題的工作。爲了實現我用外觀API如下背景:

didFinishLaunching ...

// Custom Navigation Bar appearance setup 
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: 
                 [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], UITextAttributeTextColor, 
                 [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5],UITextAttributeTextShadowColor, 
                 [NSValue valueWithUIOffset:UIOffsetMake(0, 1)], 
                 UITextAttributeTextShadowOffset,nil]]; 
// Used to deal with the rotation of the nav bar when implemented outside of Navigation Controller 
[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight]; 
[[UINavigationBar appearance] setContentMode:UIViewContentModeScaleAspectFit]; 

// Set the background image 
UIImage *imageBg = [[UIImage imageNamed: @"mainNavBar"] resizableImageWithCapInsets:UIEdgeInsetsMake(0,5,0,5)]; 
[[UINavigationBar appearance] setBackgroundImage:imageBg forBarMetrics:UIBarMetricsDefault]; 

// Used to push the title down slightly when in Landscape and NavBar outside of Navigation Controller 
[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:2 forBarMetrics:UIBarMetricsLandscapePhone]; 

我那麼子類UINavigationBar的左按鈕創建下列要求: 子類UINavigationBar的的:awakeFromNib

UINavigationItem* ni = [[UINavigationItem alloc] init]; 
UIButton *leftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 38.0f, 29.0f)]; 
[leftButton setImage:[UIImage imageNamed:@"menuBarItem"] forState:UIControlStateNormal]; 
[leftButton addTarget:nil action:@selector(menuItemPressed:) forControlEvents:UIControlEventTouchUpInside]; 
[leftButton setContentMode:UIViewContentModeScaleAspectFit]; 
[leftButton setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin]; 
UIBarButtonItem *b =[[UIBarButtonItem alloc] initWithCustomView:leftButton]; 
ni.leftBarButtonItem = b; 
self.items = @[ni]; 

然後在故事板內添加一個NavigationBar到有問題的VC並鏈接到正確的子類。我還爲該控制器的故事板中的導航欄添加了一個附加按鈕項並鏈接到插座。然後在VC中我嘗試更新的標題,右按鍵與下方:保存子類的導航欄

視圖控制器:viewDidLoad中

// Set VC Title for NavBar 
self.title = NSLocalizedString(@"NavBarHomeTitle", @"Navigation Bar - Home page title"); 

// Setup the right navigation bar item 
UIImage *addImage = [UIImage imageNamed:@"addGameButton"]; 
UIButton *addButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[addButton setFrame:CGRectMake(0, 0, addImage.size.width, addImage.size.height)]; 
[addButton setBackgroundImage:addImage forState:UIControlStateNormal]; 
[addButton addTarget:self action:@selector(addGameButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
[self.rightBarButtonItem setCustomView:addButton]; 

結果是一個導航欄,只有左按鈕。現在,我相信這是因爲awakeFromNib碼以上的alloc初始化一個新的UINavigationItem因此我無法控制的標題和一個按鈕添加到它。我怎樣才能完成這個?這是最好的方法,還是有其他人我不能看到關於如何處理這個問題的深入教程。

回答

10

你更好的選擇是使用導航控制器,它充當詢問它的當前顯示視圖控制器,並更新導航欄中的控制器。

而不是繼承導航欄,你應該繼承導航控制器。然後,只要顯示的視圖控制器發生變化,您可以通過將其添加到該視圖控制器的導航項目來設置左側按鈕項目。每個視圖控制器可以指定它需要的任何正確的bar按鈕項目。

最簡單的方法是讓導航控制器充當自己的代理並實現navigationController:willShowViewController:。使用此方法,它可以訪問傳遞的視圖控制器的navigationItem並設置leftBarButtonItem。如果需要,您還可以訪問導航和視圖控制器的其他方法。

每個視圖控制器還會在viewDidLoad中將其self.navigationItem.rightBarButtonItem(s)設置爲適合其視圖要求的按鈕。比如你的'addGameButton'欄按鈕。

以這種方式工作時,外觀將像您一樣工作,視圖控制器的標題將自動工作,並且您擁有完全控制權,並且您的導航控制器子類中的方法可以執行您的按鈕和交互式自定義。

+0

謝謝,你能否提供一些關於如何完成這個請求的信息?我瞭解導航控制器的子類,但我不確定如何設置項目以及'..可以指定任何正確的條形按鈕項目(S)它需要'...每個VC? – StuartM 2013-05-08 22:32:14

+0

您可以提供的其他任何信息嗎? – StuartM 2013-05-12 15:06:54

+0

我認爲這條路線的問題是我有大約10個視圖控制器需要在他們自己的導航控制器中?或者你的意思是每次都有一個導航控制器並推送一個新的根視圖控制器? – StuartM 2013-05-12 15:59:24

相關問題