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