iOS自定義導(dǎo)航條(頁面手勢(shì)返回時(shí) 導(dǎo)航條更隨控制器一起滑動(dòng))

前段時(shí)間被問到一個(gè)問題就是一個(gè)JD的UI效果如圖


![IMG_0485.PNG](http://upload-images.jianshu.io/upload_images/1907672-089e50562a5f38c6.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

其實(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ì)比控制器款


F9B1A4A9-0D36-455A-88F0-D29EF472AAB5.png

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


6495EAEE-55FD-47AB-B5C7-A29CE41795BF.png

大概原因因該是我現(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)的鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,257評(píng)論 4 61
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,013評(píng)論 25 709
  • 到現(xiàn)在回憶一下,有兩個(gè)人對(duì)我產(chǎn)生了重要的影響。 都是初中一年級(jí)認(rèn)識(shí)的,一男一女。 我小的時(shí)候特別開朗好動(dòng),愛出風(fēng)頭...
    記璐閱讀 359評(píng)論 2 2
  • 1. 麗麗最近很煩惱,她說和男友同居了一年半,發(fā)現(xiàn)他身上有許多以前從來沒發(fā)現(xiàn)的缺點(diǎn)。比如做事拖拉、不講衛(wèi)生。每次下...
    葉上清之宿雨閱讀 9,044評(píng)論 30 130

友情鏈接更多精彩內(nèi)容