對nextVC 進行屬性賦值后,執行push跳轉,方法的執行順序:
?A跳轉到B
代碼順序執行:
B的init 方法;(此方法中? B的navigationController 不存在。)
B的屬性賦值方法;
A中當前方法中Push 操作;
A中當前方法的剩余操作;
A viewWillDisappear
B viewDidLoad
B viewWillAppear
導航push 跳轉動作
A viewDidDisappear
B viewDidAppear
其他知識補充
[UIApplication sharedApplication].statusBarHidden = YES;
上述方法只能實現在程序跳過loading(即啟動畫面)的時候才能隱藏狀態欄。如果想要在啟動畫面開始即隱藏狀態欄,則要修改app的info.plist文件,新增UIStatusBarHidden鍵(Status bar is initially hidden),其值是YES。
設置導航欄的背景圖片
(多見于導航背景顏色是漸變顏色,使用一張圖片)但是這張圖片設置好以后,所有的控件的Y坐標都會下移64,也就是說,這張圖片會占用屏幕的64pt 高度的屏幕,而且無法被普通試圖覆蓋使用
[self.navigationController.navigationBar setBackgroundImage:[ImageUtilities createImageWithColor:[ColorUtils colorWithHexString:orange_color]] forBarMetrics:UIBarMetricsDefault];
或者 AppDelegate中 ? [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navBg"] forBarMetrics:UIBarMetricsDefault];
設置普通的導航欄顏色
在入口類中全局設置就可以達到統一導航欄顏色的效果。
?[[UINavigationBar appearance] setBarTintColor: RGB(3, 14, 30, 1)];
你會發現你設置的導航顏色是正常的色值,但是就是偏淡,那是因為導航的默認屬性是半透明的,
[[UINavigationBarappearance]setTranslucent:NO];設為不透明,帶來的問題就是導航條占了64 像素 ?#define NavHeight ? 0 ? ? ? ? ? ? ? ? ? 導航高度修改為0
關于導航返回:
如果APP通過navigationController從A視圖跳轉至B視圖,導航的返回按鈕的加載原理是這樣的:?
1、如果B視圖有一個自定義的左側按鈕(leftBarButtonItem),則會顯示這個自定義按鈕(沒有后退箭頭);?
2、如果B沒有自定義按鈕,但是A視圖的backBarButtonItem屬性有自定義項,則顯示這個自定義項;?
3、如果前2條都沒有,則默認顯示一個后退按鈕,后退按鈕的標題是A視圖的標題(沒有標題,則顯示“back”)。
所以我們對于返回按鈕的樣式需要可以如下設置可得:
【1】< 文字文字? 這個需要我們A頁面的 navigationItem.title 不為空
【2】<返回? 這個需要我們A頁面的?navigationItem.title 為空即可,一般是我們定義了?navigationItem.titleView而沒有設置?navigationItem.title
【3】<? ?只有圖標沒有文字? 這個效果我們可以設置A視圖的backBarButtonItem屬性,或者自定義B視圖的左側按鈕(leftBarButtonItem)
? ? 首先ios7 之后只要使用系統自帶的導航效果就有手動滑動返回的效果。但是當自定義返回按鈕時,這種手動滑動返回的效果就沒有了。
一個箭頭后面帶有文字的返回是使用的ios 自帶的backBarButtonItem? ,顯示的字體文字是push之前的上層頁面的 title? ,如果希望文字是自定義的,需要在push 之前
? self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"嘻嘻" style:UIBarButtonItemStyleBordered target:nil action:nil];//不寫就是back
[UIBarButtonItemalloc]initWithImage//這個圖片會替代文字的位置,右邊的粗的返回箭頭還在
SecondViewController *sec = [[SecondViewController alloc]init];
[self.navigationController pushViewController:sec animated:YES ];
在push 之后的那個VC中可以設置這返回的顏色:
[self.navigationController.navigationBar setTintColor:[UIColor redColor]];//不寫默認是藍色的back
但是這個設置不會影響第二個VC的title 的顏色(默認的一直黑色)。
在BaseViewController的ViewDidLoad中如下設置即可:注意不用在設置
self.navigationItem.leftBarButtonItem =[[UIBarButtonItem alloc] initWithCustomView:leftButton];即可返回
[self.navigationController.navigationBar setTintColor:[UIColor whiteColor]];
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] init];
backItem.title = @"返回";
self.navigationItem.backBarButtonItem = backItem;
若想在自定義返回按鈕的情況下添加手動返回:在最外層的VC中設置即可。
1? 遵循協議:UIGestureRecognizerDelegate
2? self.navigationController.interactivePopGestureRecognizer.delegate = self;
3? 重寫協議方法:
?-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{? ?
?if (self.navigationController.viewControllers.count == 1)//關閉主界面的右滑返回{? ?return NO;}
else{return YES; }}
將狀態欄隱藏就可實現這樣不錯的頁面效果
PS: ?backBarButtonItem的自定義事件是不會被執行的
backItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(back)];
self.navigationItem.backBarButtonItem = backItem;//back事件不會被調用
self.navigationItem.leftBarButtonItem = backItem;//back事件會被調用
要自定義返回按鈕,直接設置backBarButtonItem是不行的
UINavigationController view層級
navigationItem
navigationItem是UIViewController的一個屬性,包含了當前頁面導航欄上需要顯示的全部信息,這個屬性是為UINavigationController服務的。
UINavigationItem屬于MVC中的M,封裝了要顯示在UiNavigationBar上的數據,定義了UINavigationItem上按鈕的觸發事件,外觀等
-initWithBarButtonSystemItem:target:action:設置按鈕樣式及觸發事件
-initWithTiltle:style:target:action: 設置標題的觸發事件
-initWithImage:style:target:action:設置視圖的觸發事件
tintColor? 設置tintColor可以影響添加在導航條上的系統樣式的按鈕的顏色
?title: 標題
?titleView :標題視圖
?leftBarButtonItem :左按鈕
?rightBarButtonItem :右按鈕
?backBarButtonItem? :返回按鈕
與UINavigationController相似,UINavigationBar也是以棧的方式管理一組UINavigationItem。提供push和pop操作item.
每個視圖控制器都有一個navigationItem屬性,navigationItem中設置的做按鈕、右按鈕、標題等,會隨著控制器的顯示,也顯示到navigationBar上
我們來看一下這些名詞是什么意思,彼此之間是什么關系。
UINavigationController是一個viewController
UINavigationBar是一個view
UINavigationItem是一個NSObject
UIBarButtonItem是一個UIBarItem,是一種專門放在bar上的特殊button
UIBarItem是一個NSObject,是是各種itme的父類
navigationcontroller直接控制viewcontrollers,然后包含的navigationbar形成整個nv的導航欄。
bar并包含整個navigationItem的棧中的viewcontrollers的navigationitem(NSArray*items屬性)。
navigationItem包含了bar視圖的全部元素(如title,tileview,backBarButtonItem等),受當前viewcontroller管理,即bar形成整個nv的導航視圖,然后每個nv頁面的導航欄元素由所在頁面的navigationItem管理。即設置當前頁面的左右barbutton,用self.navigationItem.leftBarButtonItem等。
導航條上多個Item
UIBarButtonItem*item1 = [[UIBarButtonItemalloc]initWithTitle:@"讀"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(start)];
UIBarButtonItem*item2 = [[UIBarButtonItemalloc]initWithTitle:@"暫停"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(nowStop)];
UIBarButtonItem*item3 = [[UIBarButtonItemalloc]initWithTitle:@"繼續"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(continueRead)];
UIBarButtonItem*item4 = [[UIBarButtonItemalloc]initWithTitle:@"停止"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(stop)];
self.navigationItem.rightBarButtonItems=@[item1,item2,item3,item4];
Toolbar
navigationController自帶了一個工具欄,通過設置 self.navigationController.toolbarHidden = NO來顯示工具欄,工具欄中的內容可以通過viewController的toolbarItems來設置,顯示的順序和設置的NSArray中存放的順序一致,其中每一個數據都一個`UIBarButtonItem`對象,可以使用系統提供的很多常用風格的對象,也可以根據需求進行自定義,`每個UIBarButtonItem可以綁定一個事件`,不常使用。
?UIBarButtonItem *one = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil];
?UIBarButtonItem *two = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:nil action:nil];
?[childOne setToolbarItems:[NSArray arrayWithObjects:flexItem, one, flexItem, two, nil]];
childOne.navigationController.toolbarHidden = NO;
topViewController Vs visibleViewController
topViewController代表當前navigation棧中最上層的VC,而visibleViewController代表當前可見的VC,它可能是topViewController,也可能是當前topViewController present出來的VC。因此UINavigationController的這兩個屬性通常情況下是一樣,但也有可能不同。