iOS中如何使用導航欄,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
成都創新互聯公司長期為1000+客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為清豐企業提供專業的網站建設、成都做網站,清豐網站改版等技術服務。擁有十年豐富建站經驗和眾多成功案例,為您定制開發。設置導航欄的樣式可分為全局設置與局部設置;
1.全局設置
全局設置一般的都是在AppDelegate中設置,這樣整個app都會生效,相關的代碼與效果圖如下:
//1.設置導航欄背景顏色 [[UINavigationBar appearance] setBarTintColor:[UIColor orangeColor]]; //2.設置導航欄背景圖片 [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigationBarImg"] forBarMetrics:UIBarMetricsDefault]; //3.設置導航欄標題樣式 [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: [UIColor purpleColor], NSForegroundColorAttributeName, [UIFont boldSystemFontOfSize:25], NSFontAttributeName, nil]]; //4.設置導航欄返回按鈕的顏色 [[UINavigationBar appearance] setTintColor:[UIColor greenColor]]; //5.設置導航欄隱藏 [[UINavigationBar appearance] setHidden:YES];
設置導航欄樣式效果圖
2.局部設置:
全局設置后,如果只有其中幾個頁面導航欄樣式不同,那么我們可以使用局部設置。
注意1:局部設置與全局設置方法相同,但調用方法的對象變成了"self.navigationController.navigationBar"
注意2:局部設置必須遵循一個原則:"進入頁面時修改,離開頁面時還原”。
比如我們進入一個頁面,需要設置當前導航欄的背景色為灰色,使用如下方法:
//進入頁面時設置顏色:灰色 - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.navigationController.navigationBar setBarTintColor:[UIColor grayColor]]; } //離開頁面時還原為全局設置:橙色 - (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [self.navigationController.navigationBar setBarTintColor:[UIColor orangeColor]]; }
iOS導航欄自帶的返回按鈕形式單一,所以大多情況下,我們都需要自定義導航欄返回按鈕。但是此時我們卻發現頁面的側滑返回功能不可用了。為了解決這個問題,我們需要在App中使用我們自定義的導航控制控制器,示例代碼如下:
#import “BaseNavigationController.h" //第一步:設置自定義導航控制器使用UIGestureRecognizerDelegate @interface BaseNavigationController ()<UIGestureRecognizerDelegate> @end @implementation BaseNavigationController - (void)viewDidLoad { [super viewDidLoad]; //第二步:設置自定義導航控制器的側滑手勢的代理 self.interactivePopGestureRecognizer.delegate = self; } //第三步:實現代理方法 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ if (self.childViewControllers.count == 1) { // 表示用戶在根控制器界面,就不需要觸發滑動手勢, return NO; } return YES; } @end
隱藏導航底部分割線也是我們偶爾會遇到的開發需求,首先我們可以通過Xcode的Debug View Hierarchy功能查看導航欄的視圖結構,效果如下:
導航欄視圖層級圖
從圖中可以看出,導航欄的底部分割線是一個UIImageView對象,而且高度只有0.5,所以我們可以據此獲取到導航欄的底部分割線對象,在一個視圖控制器中實現此需求,代碼如下:
#import "TestViewController.h" @interface TestViewController () //第一步:設置一個屬性,存放導航欄底部分割線對象 @property (nonatomic, strong) UIImageView *navBarBottomImage; @end @implementation TestViewController - (void)viewDidLoad { [super viewDidLoad]; ////第三步:獲取導航欄底部分割線對象 UIImageView *navBarBottomImage = [self findNavBarBottomImage:self.navigationController.navigationBar]; self.navBarBottomImage = navBarBottomImage; } //第四步:設置分割線的顯示或隱藏 //進入頁面隱藏分割線 - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; self.navBarBottomImage.hidden = YES; } //離開頁面時顯示分割線 -(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; self.navBarBottomImage.hidden = NO; } //第二步:添加用于獲取導航欄分割線的方法 //導航欄底部分割線是一個UIImageView,且高度不超過1.0個高度,可據此查找此對象 -(UIImageView *)findNavBarBottomImage:(UIView *)view { if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) { return (UIImageView *)view; } for (UIView *subview in view.subviews) { UIImageView *imageView = [self findNavBarBottomImage:subview]; if (imageView) { return imageView; } } return nil; }
1.內容偏移屬性:automaticallyAdjustsScrollViewInsets
automaticallyAdjustsScrollViewInsets是視圖控制器的一個屬性,默認為YES,用于優化滑動類視圖(繼承于UIScrollView的視圖)在視圖控制里的顯示:
iOS系統的導航欄UINavigationBar與標簽欄UITabBar默認都是半透明模糊效果,在這種情況下系統會對視圖控制器的UI布局進行優化:視圖控制器里面第一個被添加進去的視圖是滑動類視圖,并且其Frame是整個屏幕大小時,系統會自動調整其contenInset,以保證滑動視圖里的內容不被UINavigationBar與UITabBar遮擋。
但是對于普通的視圖,此時我們仍然需要注意:非滑動視圖的布局仍然要考慮導航欄和標簽欄高度,注意不被遮擋,比如布局的時候加上導航欄高度,以免內容被導航欄遮擋。
我們可以通過一段代碼來測試一下效果,在默認導航欄(半透明)的視圖控制器里添加如下代碼:
//UITextView是滑動視圖,內容自動向下偏移,不會被導航欄覆蓋 UITextView *leftTextView = [[UITextView alloc] init]; leftTextView.frame = CGRectMake(0, 0,100, kDeviceHeight); // leftTextView.backgroundColor = [UIColor lightGrayColor]; leftTextView.text = @"君不見,黃河之水天上來,奔流到海不復回。君不見,高堂明鏡悲白發,朝如青絲暮成雪。人生得意須盡歡,莫使金樽空對月。天生我材必有用,千金散盡還復來。"; leftTextView.font = [UIFont systemFontOfSize:18]; leftTextView.editable = NO; [self.view addSubview:leftTextView]; //UIView是非滑動視圖,內容被導航欄部分覆蓋 UIView *rightView= [[UIView alloc] initWithFrame:CGRectMake(150, 0, 100, 100)]; rightView.backgroundColor = [UIColor redColor]; [self.view addSubview:rightView];
導航欄透明情況下,滑動視圖自動偏移,普通視圖被遮擋
其實,這種系統的優化也是可以控制關閉的,關閉優化之后,滑動視圖就會和普通視圖一樣,如果還設置其布局的原點是(0,0),其內容就會被導航欄所覆蓋,關鍵代碼如下:
//automaticallyAdjustsScrollViewInsets在11.0后失效,所以需要判斷 if (@available(iOS 11.0,*)) { scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; }else{ //automaticallyAdjustsScrollViewIn,關閉自動偏移的系統優化 self.automaticallyAdjustsScrollViewInsets = NO; }
2.邊緣延伸屬性:edgesForExtendedLayout
edgesForExtendedLayout也是視圖控制器的布局屬性,默認值是UIRectEdgeAll,即:當前視圖控制器里各種UI控件會忽略導航欄和標簽的存在,布局時若設置其原點設置為(0,0),視圖會延伸顯示到導航欄的下面被覆蓋。
所以我們可以設置self.edgesForExtendedLayout=UIRectEdgeNone
,此時視圖控制器里內容就會避開導航欄和標簽欄了,依然是上面的leftTextView和rightView,設置了UIRectEdgeNone之后的效果圖如下:
self.edgesForExtendedLayout=UIRectEdgeNone
3.導航欄透明屬性translucent
上述兩種屬性都是在解決導航欄半透明情況下的布局問題,但是如果我們的需求就是導航欄不透明,那么視圖控制器里的控件就會默認從(0,64)開始布局了,設置導航欄不透明的方法如下:
self.navigationController.navigationBar.translucent= NO;
關于iOS中如何使用導航欄問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創新互聯網站建設公司行業資訊頻道了解更多相關知識。
另外有需要云服務器可以了解下創新互聯建站m.newbst.com,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
分享文章:iOS中如何使用導航欄-創新互聯
新聞來源:http://m.newbst.com/article6/dcdcog.html
成都網站建設公司_創新互聯,為您提供做網站、網站收錄、網站維護、靜態網站、App設計、云服務器
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯