iPhone UIKit详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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 改变导航条的背景色