步驟:導(dǎo)航欄主題 -> 添加搜索框 -> 易混淆的屬性 -> 自定義搜索框 -> 標(biāo)題按鈕 -> 彈出下拉菜單 -> 封裝下拉菜單
導(dǎo)航欄主題
在HMNavigationController類中,修改initialize方法,設(shè)置NavigationBar和UIBarButtonItem的主題,如下:

設(shè)置NavigationBar的主題,如下:

設(shè)置UIBarButtonItem的主題,如下:
的主題,如下:

添加搜索框
在HMDiscoverViewController類的viewDidLoad方法中,添加搜索框,由于系統(tǒng)的UISearchBar不能滿足要求,所以通過UITextField控件來(lái)創(chuàng)建搜索框,如下:

APP的界面:

易混淆的屬性
具體可看iOS總結(jié)的內(nèi)容屬性總結(jié)(MJ總結(jié))和item屬性總結(jié)(MJ總結(jié))。
自定義搜索框
搜索框在很多項(xiàng)目中都可能使用到,所以要對(duì)其進(jìn)行封裝。通過創(chuàng)建一個(gè)繼承UITextField類的HMSearchBar對(duì)搜索框進(jìn)行封裝,不同于之前的Category。
首先,在HMDiscoverViewController類的viewDidLoad方法中,設(shè)置自定義的搜索框,如下:

在HMSearchBar類中,封裝搜索框的詳細(xì)設(shè)置,并把方法searchBar提供給外界使用,如下:

在initWithFrame方法中,自定義搜索框的細(xì)節(jié),如下:

標(biāo)題按鈕
在HMHomeViewController類的viewDidLoad方法中,設(shè)置導(dǎo)航欄中間的標(biāo)題按鈕,如下:

標(biāo)題按鈕的點(diǎn)擊事件如下:

對(duì)于標(biāo)題按鈕的frame布局和細(xì)節(jié)都封裝在繼承UIButton的HMTitleButton類中,如下:

其中,在initWithFrame方法中,封裝標(biāo)題按鈕的細(xì)節(jié),如下:

而frame的布局具體如下:

APP的界面:

彈出下拉菜單
在標(biāo)題按鈕的點(diǎn)擊事件titleClick中,彈出一個(gè)簡(jiǎn)易的菜單,這個(gè)菜單不能收起,如下:

APP的界面:

封裝下拉菜單
下拉菜單在很多項(xiàng)目中都可能使用到,所以要對(duì)其進(jìn)行封裝。通過創(chuàng)建一個(gè)繼承UIView類的HMDropdownMenu對(duì)下拉菜單進(jìn)行封裝。
在標(biāo)題按鈕的點(diǎn)擊事件titleClick中,創(chuàng)建下拉菜單并設(shè)置內(nèi)容,如下:

在HMDropdownMenu的實(shí)現(xiàn)類中,封裝下拉菜單的細(xì)節(jié),其所用到的屬性和方法如下:

其中,屬性有:

方法具體是:
方法menu用于創(chuàng)建下拉菜單并對(duì)其進(jìn)行初始化,如下:

方法setContent與setContentController用于設(shè)置內(nèi)容和內(nèi)容控制器的細(xì)節(jié),如下:

方法containerView是懶加載方法,創(chuàng)建用來(lái)顯示具體內(nèi)容的容器,如下:

方法showFrom:與dismiss用于顯示和銷毀下拉菜單,另外,點(diǎn)擊下拉菜單的外面可以銷毀下拉菜單,這時(shí)會(huì)觸發(fā)方法touchesBegan:withEvent響應(yīng)dismiss方法,如下:


在HMDropdownMenu的聲明類中,將某些屬性和方法提供給外界創(chuàng)建下拉菜單使用,如下:

這些屬性和方法具體有:

在顯示和銷毀下拉菜單的同時(shí)需要改變標(biāo)題按鈕的箭頭,這時(shí)候采用代理模式。
前三步:
1.在HMDropdownMenu的聲明類中聲明代理協(xié)議
2.設(shè)置代理對(duì)象屬性
如下:

3.在實(shí)現(xiàn)類通知代理對(duì)象--下拉菜單的變化
通知代理對(duì)象的具體可見上面的方法showFrom:與dismiss。
后三步:
1.設(shè)置代理,可見titleClick:方法
2.遵守代理協(xié)議
如下:

3.實(shí)現(xiàn)代理方法
如下:

APP的界面:
