前段時(shí)間被問到一個(gè)問題就是一個(gè)JD的UI效果如圖
其實(shí)就是一個(gè)原生的導(dǎo)航條 一個(gè)是自定義的導(dǎo)航條
第一想法 肯定是 將原生的navgationBar 隱藏掉 讓后搞一個(gè)UIview 覆蓋到原來的位置, 然后在UIview 的上面分別添加左button 和右button 和中間的titleview 當(dāng)然這樣做汪全是可以的 但是我感覺那么 navgationBar 使用的時(shí)候就不夠方便了
所以 我們可以單獨(dú)創(chuàng)建一個(gè)NavgationBar 然后添加到視圖控制器上
那么首先我們創(chuàng)建一個(gè)基類 讓其繼承與UIviewcontroler 并且項(xiàng)目中的其他項(xiàng)目全部繼承與這個(gè)基類
#import <UIKit/UIKit.h>
#import "ZJNavgationbar.h"
@interface ZJbaseViewController : UIViewController
@property (nonatomic,strong)UINavigationBar * NavigationBar;
@property (nonatomic,strong)UINavigationItem *ZJNavigationItem;
@end
將UINavigationBar定義成基類控制器的公開屬性
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if (!self.NavigationBar) {
self.NavigationBar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0,0,self.view.frame.size.width,64)];
[self.view addSubview:self.NavigationBar];
self.ZJNavigationItem = [[UINavigationItem alloc]initWithTitle:@"hellows"];
[self.NavigationBar pushNavigationItem:self.ZJNavigationItem animated:YES];
UIBarButtonItem * logeItem = [[UIBarButtonItem alloc]initWithTitle:@"登錄" style:UIBarButtonItemStylePlain target:self action:@selector(logeClick)];
NSArray * arr = @[logeItem];
self.ZJNavigationItem.rightBarButtonItems = arr;
if ([self.navigationController.childViewControllers count]>1) {
UIBarButtonItem * backItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(backclick)];
NSArray * arrleft = @[backItem];
self.ZJNavigationItem.leftBarButtonItems = arrleft;
}
}
}
在控制器的 viewWillAppear 中判斷是否存在 NavgationBar 存在的話就不創(chuàng)建 然則反之.
并且把 navgationbar 添加在 控制器的self.view 上
那么 說有集成于基類的控制器 都會(huì)擁有這個(gè)導(dǎo)航欄
2.導(dǎo)航欄添加名稱
首先分析 原生的導(dǎo)航欄添加標(biāo)題
self.navigationItem.title = @"名稱";
我們可以看出來 標(biāo)題時(shí)添加在navgationitem 上 而且 navgationitem 是控制器的屬性 而且是只讀的 這時(shí)候在通過這個(gè)屬性賦值的話 就會(huì)失效
那么為了方便 我們應(yīng)該同事也自定義一個(gè)UINavigationItem
同時(shí)也將 屬性暴漏出來 如上述代碼
這時(shí)候呢 那么 添加左右button 也就可以和原來一樣 而且可以實(shí)現(xiàn)上圖的效果.
但是還有一點(diǎn)問題就是 如果控制器是帶xib 文件的話 那么導(dǎo)航欄的寬度會(huì)比控制器款

正常的控制器效果是這樣的

大概原因因該是我現(xiàn)在了 viewwillapper 中的緣故
有啥好的解決辦法 可以告訴我哦
以后還會(huì)更加深入的解析
感覺好像忘了點(diǎn)啥 那就是 讓界面允許全屏滑動(dòng)返回
很簡單只要一句代碼搞定
在基類的viewvillappear中添加這一句話 這是kvc 的方法
[self.navigationController.interactivePopGestureRecognizer setValue:@([UIScreen mainScreen].bounds.size.width) forKeyPath:@"_recognizer._settings._edgeSettings._edgeRegionSize"];
效果如下
好吧 我不會(huì)傳動(dòng)態(tài)圖
今天看了一下昨天遺留下的問題 就是在xib 繼承基類是 導(dǎo)航條寬度比屏幕要寬,現(xiàn)在解決的
就是在創(chuàng)建 navgationBar 是frame的寬 不能寫 self.view.bounds,size.width
應(yīng)該寫成
self.NavigationBar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0,0,[UIScreen mainScreen].bounds.size.width,64)];
不上圖了 哈哈哈哈
這些問題都解決了 還有一個(gè)就是 之所以自定義導(dǎo)航欄有一個(gè)原因是 不同的iOS系統(tǒng)版本 導(dǎo)航欄格式不同 自定義是為了統(tǒng)一格式. 很顯然 我一上的自定義辦法不太好 達(dá)不到這樣的效果啊
5月26 補(bǔ)充!!!歡迎留下和文章主題相關(guān)的鏈接