官术网_书友最值得收藏!

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 改變導航條的背景色

主站蜘蛛池模板: 永吉县| 榕江县| 秭归县| 闸北区| 阿克苏市| 乌拉特前旗| 宁远县| 汾西县| 东港市| 浦县| 伊吾县| 勃利县| 冕宁县| 台北市| 吉林市| 商丘市| 汶川县| 南涧| 东山县| 西乡县| 介休市| 仪征市| 确山县| 新沂市| 井冈山市| 平昌县| 和静县| 尼勒克县| 晋城| 磐石市| 禄劝| 小金县| 长沙市| 招远市| 利辛县| 客服| 秦皇岛市| 鸡东县| 乌兰察布市| 临汾市| 图木舒克市|