- iPhone UIKit詳解
- 王志剛 王中元 朱蕾編著
- 1270字
- 2019-01-01 07:04:27
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 改變導航條的背景色