亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

iOS中導(dǎo)航欄的基本使用匯總

 更新時間:2018年07月22日 10:17:02   作者:風(fēng)恣  
導(dǎo)航欄作為iOS開發(fā)的一大空控件來說,是非常的重要這篇文章主要給大家介紹了關(guān)于iOS中導(dǎo)航欄的基本使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、設(shè)置導(dǎo)航欄樣式

設(shè)置導(dǎo)航欄的樣式可分為全局設(shè)置與局部設(shè)置;

1.全局設(shè)置

全局設(shè)置一般的都是在AppDelegate中設(shè)置,這樣整個app都會生效,相關(guān)的代碼與效果圖如下:

//1.設(shè)置導(dǎo)航欄背景顏色
[[UINavigationBar appearance] setBarTintColor:[UIColor orangeColor]];
 
//2.設(shè)置導(dǎo)航欄背景圖片
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigationBarImg"] forBarMetrics:UIBarMetricsDefault];
 
//3.設(shè)置導(dǎo)航欄標(biāo)題樣式
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
 [UIColor purpleColor], NSForegroundColorAttributeName,
 [UIFont boldSystemFontOfSize:25], NSFontAttributeName, nil]];
 
//4.設(shè)置導(dǎo)航欄返回按鈕的顏色
[[UINavigationBar appearance] setTintColor:[UIColor greenColor]];

//5.設(shè)置導(dǎo)航欄隱藏
[[UINavigationBar appearance] setHidden:YES];

設(shè)置導(dǎo)航欄樣式效果圖

2.局部設(shè)置:

全局設(shè)置后,如果只有其中幾個頁面導(dǎo)航欄樣式不同,那么我們可以使用局部設(shè)置。

注意1:局部設(shè)置與全局設(shè)置方法相同,但調(diào)用方法的對象變成了"self.navigationController.navigationBar"

注意2:局部設(shè)置必須遵循一個原則:"進(jìn)入頁面時修改,離開頁面時還原”。

比如我們進(jìn)入一個頁面,需要設(shè)置當(dāng)前導(dǎo)航欄的背景色為灰色,使用如下方法:

//進(jìn)入頁面時設(shè)置顏色:灰色
- (void)viewWillAppear:(BOOL)animated{
 [super viewWillAppear:animated];
 [self.navigationController.navigationBar setBarTintColor:[UIColor grayColor]];
}

//離開頁面時還原為全局設(shè)置:橙色
- (void)viewWillDisappear:(BOOL)animated{
 [super viewWillDisappear:animated];
 [self.navigationController.navigationBar setBarTintColor:[UIColor orangeColor]];
}

二、解決自定義導(dǎo)航欄返回按鈕后側(cè)滑不可用問題

iOS導(dǎo)航欄自帶的返回按鈕形式單一,所以大多情況下,我們都需要自定義導(dǎo)航欄返回按鈕。但是此時我們卻發(fā)現(xiàn)頁面的側(cè)滑返回功能不可用了。為了解決這個問題,我們需要在App中使用我們自定義的導(dǎo)航控制控制器,示例代碼如下:

#import “BaseNavigationController.h"
//第一步:設(shè)置自定義導(dǎo)航控制器使用UIGestureRecognizerDelegate
@interface BaseNavigationController ()<UIGestureRecognizerDelegate>
@end

@implementation BaseNavigationController
- (void)viewDidLoad {
 [super viewDidLoad];
 //第二步:設(shè)置自定義導(dǎo)航控制器的側(cè)滑手勢的代理
 self.interactivePopGestureRecognizer.delegate = self;
}
 

//第三步:實現(xiàn)代理方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
 if (self.childViewControllers.count == 1) {
 // 表示用戶在根控制器界面,就不需要觸發(fā)滑動手勢,
 return NO;
 }
 return YES;
}
@end

三、隱藏導(dǎo)航欄底部的分割線

隱藏導(dǎo)航底部分割線也是我們偶爾會遇到的開發(fā)需求,首先我們可以通過Xcode的Debug View Hierarchy功能查看導(dǎo)航欄的視圖結(jié)構(gòu),效果如下:

導(dǎo)航欄視圖層級圖

從圖中可以看出,導(dǎo)航欄的底部分割線是一個UIImageView對象,而且高度只有0.5,所以我們可以據(jù)此獲取到導(dǎo)航欄的底部分割線對象,在一個視圖控制器中實現(xiàn)此需求,代碼如下:

#import "TestViewController.h"
@interface TestViewController ()
//第一步:設(shè)置一個屬性,存放導(dǎo)航欄底部分割線對象
@property (nonatomic, strong) UIImageView *navBarBottomImage;
@end

@implementation TestViewController
- (void)viewDidLoad {
 [super viewDidLoad];
 ////第三步:獲取導(dǎo)航欄底部分割線對象
 UIImageView *navBarBottomImage = [self findNavBarBottomImage:self.navigationController.navigationBar];
 self.navBarBottomImage = navBarBottomImage;
 }

//第四步:設(shè)置分割線的顯示或隱藏
//進(jìn)入頁面隱藏分割線
- (void)viewWillAppear:(BOOL)animated{
 [super viewWillAppear:animated];
 self.navBarBottomImage.hidden = YES;
}
//離開頁面時顯示分割線
-(void)viewWillDisappear:(BOOL)animated{
 [super viewWillDisappear:animated];
 self.navBarBottomImage.hidden = NO;
}

//第二步:添加用于獲取導(dǎo)航欄分割線的方法
//導(dǎo)航欄底部分割線是一個UIImageView,且高度不超過1.0個高度,可據(jù)此查找此對象
-(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;
}

四、導(dǎo)航欄引起的布局問題

1.內(nèi)容偏移屬性:automaticallyAdjustsScrollViewInsets

automaticallyAdjustsScrollViewInsets是視圖控制器的一個屬性,默認(rèn)為YES,用于優(yōu)化滑動類視圖(繼承于UIScrollView的視圖)在視圖控制里的顯示:

iOS系統(tǒng)的導(dǎo)航欄UINavigationBar與標(biāo)簽欄UITabBar默認(rèn)都是半透明模糊效果,在這種情況下系統(tǒng)會對視圖控制器的UI布局進(jìn)行優(yōu)化:視圖控制器里面第一個被添加進(jìn)去的視圖是滑動類視圖,并且其Frame是整個屏幕大小時,系統(tǒng)會自動調(diào)整其contenInset,以保證滑動視圖里的內(nèi)容不被UINavigationBar與UITabBar遮擋。

但是對于普通的視圖,此時我們?nèi)匀恍枰⒁猓悍腔瑒右晥D的布局仍然要考慮導(dǎo)航欄和標(biāo)簽欄高度,注意不被遮擋,比如布局的時候加上導(dǎo)航欄高度,以免內(nèi)容被導(dǎo)航欄遮擋。

我們可以通過一段代碼來測試一下效果,在默認(rèn)導(dǎo)航欄(半透明)的視圖控制器里添加如下代碼:

//UITextView是滑動視圖,內(nèi)容自動向下偏移,不會被導(dǎo)航欄覆蓋
UITextView *leftTextView = [[UITextView alloc] init];
leftTextView.frame = CGRectMake(0, 0,100, kDeviceHeight); //
leftTextView.backgroundColor = [UIColor lightGrayColor];
leftTextView.text = @"君不見,黃河之水天上來,奔流到海不復(fù)回。君不見,高堂明鏡悲白發(fā),朝如青絲暮成雪。人生得意須盡歡,莫使金樽空對月。天生我材必有用,千金散盡還復(fù)來。";
leftTextView.font = [UIFont systemFontOfSize:18];
leftTextView.editable = NO;
[self.view addSubview:leftTextView];
 
//UIView是非滑動視圖,內(nèi)容被導(dǎo)航欄部分覆蓋
UIView *rightView= [[UIView alloc] initWithFrame:CGRectMake(150, 0, 100, 100)];
rightView.backgroundColor = [UIColor redColor];
[self.view addSubview:rightView];

導(dǎo)航欄透明情況下,滑動視圖自動偏移,普通視圖被遮擋

其實,這種系統(tǒng)的優(yōu)化也是可以控制關(guān)閉的,關(guān)閉優(yōu)化之后,滑動視圖就會和普通視圖一樣,如果還設(shè)置其布局的原點是(0,0),其內(nèi)容就會被導(dǎo)航欄所覆蓋,關(guān)鍵代碼如下:

//automaticallyAdjustsScrollViewInsets在11.0后失效,所以需要判斷
if (@available(iOS 11.0,*)) {
 scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}else{
 //automaticallyAdjustsScrollViewIn,關(guān)閉自動偏移的系統(tǒng)優(yōu)化
 self.automaticallyAdjustsScrollViewInsets = NO;
}

2.邊緣延伸屬性:edgesForExtendedLayout

edgesForExtendedLayout也是視圖控制器的布局屬性,默認(rèn)值是UIRectEdgeAll,即:當(dāng)前視圖控制器里各種UI控件會忽略導(dǎo)航欄和標(biāo)簽的存在,布局時若設(shè)置其原點設(shè)置為(0,0),視圖會延伸顯示到導(dǎo)航欄的下面被覆蓋。

所以我們可以設(shè)置self.edgesForExtendedLayout=UIRectEdgeNone,此時視圖控制器里內(nèi)容就會避開導(dǎo)航欄和標(biāo)簽欄了,依然是上面的leftTextView和rightView,設(shè)置了UIRectEdgeNone之后的效果圖如下:

self.edgesForExtendedLayout=UIRectEdgeNone

3.導(dǎo)航欄透明屬性translucent

上述兩種屬性都是在解決導(dǎo)航欄半透明情況下的布局問題,但是如果我們的需求就是導(dǎo)航欄不透明,那么視圖控制器里的控件就會默認(rèn)從(0,64)開始布局了,設(shè)置導(dǎo)航欄不透明的方法如下:

self.navigationController.navigationBar.translucent= NO;

相關(guān)文章:

iOS狀態(tài)欄使用

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • IOS 靜態(tài)方法與動態(tài)方法詳解

    IOS 靜態(tài)方法與動態(tài)方法詳解

    這篇文章主要介紹了IOS 靜態(tài)方法與動態(tài)方法詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • iOS實現(xiàn)獲取系統(tǒng)iTunes音樂的方法示例

    iOS實現(xiàn)獲取系統(tǒng)iTunes音樂的方法示例

    這篇文章主要給大家介紹了關(guān)于iOS如何實現(xiàn)獲取系統(tǒng)iTunes音樂的相關(guān)資料,文中通過示例代碼給大家詳細(xì)介紹了實現(xiàn)的方法,并給大家介紹了MPMediaPickerController的相關(guān)知識,對大家的學(xué)習(xí)或者工作具有一定的幫助,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 教你如何解決XCODE升級后插件不能用問題

    教你如何解決XCODE升級后插件不能用問題

    Xcode 每次更新有個很頭疼的問題,就是插件都會失效,要重裝。 不得不說好多插件還是非常方便能提高效率。那么如何來解決這個問題呢,今天我們就來探討下。
    2015-11-11
  • iOS上下文實現(xiàn)評價星星示例代碼

    iOS上下文實現(xiàn)評價星星示例代碼

    這篇文章主要介紹了iOS上下文實現(xiàn)評價星星的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • iOS動畫案例(1) 類似于qq賬號信息里的一個動畫效果

    iOS動畫案例(1) 類似于qq賬號信息里的一個動畫效果

    做一個類似于qq賬號信息里的一個動畫,感覺挺有意思,下面給大家分享iOS動畫案例(1) 類似于qq賬號信息里的一個動畫效果,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-01-01
  • iOS實現(xiàn)側(cè)拉欄抽屜效果

    iOS實現(xiàn)側(cè)拉欄抽屜效果

    這篇文章主要為大家詳細(xì)介紹了iOS實現(xiàn)側(cè)拉欄抽屜效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • iOS開發(fā)之通過銀行卡號獲取所屬銀行名稱

    iOS開發(fā)之通過銀行卡號獲取所屬銀行名稱

    本文給大家分享一段代碼關(guān)于ios通過銀行卡號獲取所屬銀行名稱,代碼簡單易懂,在項目開發(fā)中經(jīng)常會遇到這樣的功能,需要的朋友一起學(xué)習(xí)吧
    2016-11-11
  • KVO實現(xiàn)自定義文件復(fù)制進(jìn)度效果

    KVO實現(xiàn)自定義文件復(fù)制進(jìn)度效果

    這篇文章主要為大家詳細(xì)介紹了KVO實現(xiàn)自定義文件復(fù)制進(jìn)度效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • iOS9與XCode7中不能使用http連接的快速解決辦法

    iOS9與XCode7中不能使用http連接的快速解決辦法

    這篇文章主要介紹了iOS9與XCode7中不能使用http連接的快速解決辦法,非常不錯具有參考借鑒價值,感興趣的朋友一起看看吧,需要的朋友可以參考下
    2016-10-10
  • 基于IOS實現(xiàn)帶箭頭的view

    基于IOS實現(xiàn)帶箭頭的view

    這篇文章封裝了一個比較常用的控件, 帶箭頭的View, iOS在很多場景下可以使用到帶箭頭的View,下面一起來學(xué)習(xí)學(xué)習(xí)。
    2016-08-08

最新評論