步驟:導(dǎo)航欄主題 -> 添加搜索框 -> 易混淆的屬性 -> 自定義搜索框 -> 標(biāo)題按鈕 -> 彈出下拉菜單 -> 封裝下拉菜單
導(dǎo)航欄主題
在HMNavigationController類中,修改initialize方法,設(shè)置NavigationBar和UIBarButtonItem的主題,如下:
設(shè)置NavigationBar的主題,如下:
設(shè)置UIBarButtonItem的主題,如下:
的主題,如下:
添加搜索框
在HMDiscoverViewController類的viewDidLoad方法中,添加搜索框,由于系統(tǒng)的UISearchBar不能滿足要求,所以通過UITextField控件來創(chuàng)建搜索框,如下:
APP的界面:
易混淆的屬性
具體可看iOS總結(jié)的內(nèi)容屬性總結(jié)(MJ總結(jié))和item屬性總結(jié)(MJ總結(jié))。
自定義搜索框
搜索框在很多項目中都可能使用到,所以要對其進(jìn)行封裝。通過創(chuàng)建一個繼承UITextField類的HMSearchBar對搜索框進(jìn)行封裝,不同于之前的Category。
首先,在HMDiscoverViewController類的viewDidLoad方法中,設(shè)置自定義的搜索框,如下:
在HMSearchBar類中,封裝搜索框的詳細(xì)設(shè)置,并把方法searchBar提供給外界使用,如下:
在initWithFrame方法中,自定義搜索框的細(xì)節(jié),如下:
標(biāo)題按鈕
在HMHomeViewController類的viewDidLoad方法中,設(shè)置導(dǎo)航欄中間的標(biāo)題按鈕,如下:
標(biāo)題按鈕的點擊事件如下:
對于標(biāo)題按鈕的frame布局和細(xì)節(jié)都封裝在繼承UIButton的HMTitleButton類中,如下:
其中,在initWithFrame方法中,封裝標(biāo)題按鈕的細(xì)節(jié),如下:
而frame的布局具體如下:
APP的界面:
彈出下拉菜單
在標(biāo)題按鈕的點擊事件titleClick中,彈出一個簡易的菜單,這個菜單不能收起,如下:
APP的界面:
封裝下拉菜單
下拉菜單在很多項目中都可能使用到,所以要對其進(jìn)行封裝。通過創(chuàng)建一個繼承UIView類的HMDropdownMenu對下拉菜單進(jìn)行封裝。
在標(biāo)題按鈕的點擊事件titleClick中,創(chuàng)建下拉菜單并設(shè)置內(nèi)容,如下:
在HMDropdownMenu的實現(xiàn)類中,封裝下拉菜單的細(xì)節(jié),其所用到的屬性和方法如下:
其中,屬性有:
方法具體是:
方法menu用于創(chuàng)建下拉菜單并對其進(jìn)行初始化,如下:
方法setContent與setContentController用于設(shè)置內(nèi)容和內(nèi)容控制器的細(xì)節(jié),如下:
方法containerView是懶加載方法,創(chuàng)建用來顯示具體內(nèi)容的容器,如下:
方法showFrom:與dismiss用于顯示和銷毀下拉菜單,另外,點擊下拉菜單的外面可以銷毀下拉菜單,這時會觸發(fā)方法touchesBegan:withEvent響應(yīng)dismiss方法,如下:
在HMDropdownMenu的聲明類中,將某些屬性和方法提供給外界創(chuàng)建下拉菜單使用,如下:
這些屬性和方法具體有:
在顯示和銷毀下拉菜單的同時需要改變標(biāo)題按鈕的箭頭,這時候采用代理模式。
前三步:
1.在HMDropdownMenu的聲明類中聲明代理協(xié)議
2.設(shè)置代理對象屬性
如下:
3.在實現(xiàn)類通知代理對象--下拉菜單的變化
通知代理對象的具體可見上面的方法showFrom:與dismiss。
后三步:
1.設(shè)置代理,可見titleClick:方法
2.遵守代理協(xié)議
如下:
3.實現(xiàn)代理方法
如下:
APP的界面: