3.4 UINavigationController的使用技巧
3.4.1 导航条的4个区域
使用UINavigationController后,会显示如图3-15所示的导航条,关于导航条的知识已经在前面的章节中进行了介绍。
图3-15 导航条
但是实际上此导航条由如图3-16所示的4个部分组成,且由navigationItem属性(UINavigationItem实例)进行管理。在各个部分中可以分别配置自己设置的按钮以及文字。
图3-16 导航条的四个部分
设置各个项目具体的实例代码如下。
// 第1行信息的追加 self.navigationItem.prompt = @"第1行信息";// 设置标题 self.navigationItem.title = @"标题"; // 在右侧追加按钮 UIBarButtonItem*rightItem = [[[UIBarButtonItem alloc] initWithBar ButtonSystemItem:UIBarButtonSystemItemCompose target:nil action:nil ] autorelease]; self.navigationItem.rightBarButtonItem = rightItem; // 在左侧追加UIImageView UIImage*image = [UIImage imageNamed:@"face.jpg"]; UIImageView*imageView = [[[UIImageView alloc] initWithImage:image] autorelease]; UIBarButtonItem*icon = [[[UIBarButtonItem alloc] initWithCustomView:imageView] autorelease]; self.navigationItem.leftBarButtonItem = icon;
另外,在navigationItem的leftBarButtonItem属性中设置了任意按钮后,默认的返回到前一画面的返回按钮将不被显示。如果想再次显示返回按钮时,可以将leftBarButtonItem属性设置为nil。
导航条左侧默认显示的原返回按钮可以通过UINavigationController 的setHidesBackButton:animated:方法进行ON/OFF的切换。
UINavigationController的leftBarButtonItem属性与rightBarButtonItem属性中可以设置各种各样的按钮。关于按钮请参照第3.6节中的详细介绍。
3.4.2 导航条的定制
导航条中还有titleView属性,可以在此titleView属性中设置任意UIView的子类,且设置的UIView子类没有任何限制。巧妙地使用设置的子类,可对导航条进行各种各样的定制。下面的实例中我们试着在titleView属性中追加UISlider控件。完成的画面如图3-17所示。
图3-17 向导航条中追加UISlider控件
移动显示在导航条中的滑块后,可以相应地改变画面的颜色。以下是具体的实现代码。
[interface] @interface UIKitPrjTitleView :UIViewController { @private UILabel* label_; UISlider* slider_; } @end [implementation] // 声明私有方法 @interface UIKitPrjTitleView() -(void)sliderDidChange; @end @implementation UIKitPrjTitleView // finalize -(void)dealloc { [slider_ release]; [label_ release]; [super dealloc]; } -(void)viewDidLoad { [super viewDidLoad]; // 顶部信息设置 self.navigationItem.prompt = @"移动滑块后将改变画面颜色"; // 创建UISlider实例,滑块变化时调用sliderDidChange:方法 slider_ = [[UISlider alloc] init]; slider_.frame = self.navigationController.navigationBar.bounds; slider_.minimumValue = 0.0; slider_.maximumValue = 1.0; slider_.value = slider_.maximumValue / 2.0; [slider_ addTarget:self action:@selector(sliderDidChange) forControlEvents:UIControlEventValueChanged]; self.navigationItem.titleView = slider_; // 创建标签,并根据滑块的值改变标签的颜色 label_ = [[UILabel alloc] init]; label_.frame = CGRectInset(self.view.bounds,10,10); label_.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIV iewAutoresizingFlexibleHeight; label_.backgroundColor = [UIColor blackColor]; [self.view addSubview:label_]; // 调用sliderDidChange方法设置滑块初始值 [self sliderDidChange]; } // 确保显示导航条以及工具条 -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:NO animated:NO]; [self.navigationController setToolbarHidden:NO animated:NO]; [self.navigationItem setHidesBackButton:YES animated:NO]; } #pragma mark ----- Private Methods ----- // 画面显示时隐藏返回按钮,触摸画面后显示返回按钮 -(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { [self.navigationItem setHidesBackButton:NO animated:YES]; } // 实现滑块移动时调用的方法,改变标签的颜色 -(void)sliderDidChange { UIColor* color = [[[UIColor alloc] initWithRed:slider_.value green:slider_.valueblue:slider_.value alpha:1.0 ] autorelease]; label_.backgroundColor = color; } @end
定制导航条并不是件特别困难的事情。本例中,创建了UISlider实例后,将其设置到UINavigationItem的titleView属性中即可。分别将UISlider的minimumValue属性以及maximumValue属性设置为0.0与1.0。因为此值后面将作为颜色值进行设置,而颜色RGB值的范围为0.0到1.0之间。另外将滑块的初始值设置为0.5。最后,当滑块移动时(具体事件为UIControlEventValueChanged)调用sliderDidChange方法,具体在addTarget:action:forControlEvents:方法中进行设置。这样将UISlider设置到titleView属性中后,即完成了导航条的定制。
在sliderDidChange方法中,调用UIColor的initWithRed:green:blue:alpha:方法创建标签的颜色,除了alpha参数设置为1.0外,其他三个参数都设置为滑块当前的值。将此创建的UIColor实例设置到UILabel实例的backgroundColor属性后,即完成了对标签颜色的设置。
3.4.3 导航条的颜色
可以通过改变UINavigationController类的tintColor属性,改变导航条的背景颜色。以下是实例代码。
// 将导航条变成红色 self.navigationController.navigationBar.tintColor = [UIColor redColor];
此代码的执行结果如图3-18所示(图中导航条的背景实际为红色)。
图3-18 改变导航条的背景色