打造一款靈活的導航欄
前言:專案中經常會遇到功能樣式各種各樣的導航欄,使用系統的也能達到需求,但是改動方面比較麻煩,特別是對於改動的時機把控問題較多,所以很多情況下都是隱藏系統的導航欄,自定義一個view區代替導航欄,導航欄的樣式無非以下幾種:
文字,圖片,與圖文混合,這幾種的組合
那麼如何打造一款適用的導航欄呢?筆者在專案中的需求,導航欄風格迥異,還牽扯到一些控制元件的漸變和隱藏效果,下面就來具體講解下封裝的過程。
筆者想到的封裝結構如下圖所示:
總體設計如上圖所示,LWNavigationBarItem
主要是對單體item
的相關設定,包括item樣式,文字,圖片和其相關樣式的定製等LWNavigationBar
是承載LWNavigationBarItem
的容器,對外提供增加,修改相關item
的介面,內部實現對item
的佈局,下面我擷取相關樣式的圖片:
1.標題漸變
2.帶下劃線的item
3.動態修改item的隱藏顯示和內容
還有其他組合這裡就不一一列舉,可以自行下載嘗試
4.使用方面
這層封裝僅僅是對導航欄的定製進行設定的,如果想要和業務結合,生成不同的導航欄,最好進行二次封裝一次,我這裡僅僅擷取一個二次封裝的方法,如下:
/*左右皆為圖片,中間標題為文字,圖片文字皆可為空 */ + (LWNavigationBar *)yg_createNavigationBarWithBarStyle:(YGNavigationBarStyle)style target:(UIViewController *)target leftImage:(UIImage * _Nullable)leftImage titleText:(NSString * _Nullable )titleText rightImage:(UIImage * _Nullable )rightImage barHeight:(CGFloat)barHeight { LWNavigationBarItem *leftItem = [[LWNavigationBarItem alloc] initWithItemType:LWNavigationBarItemOnlyImage]; [leftItem setItemImage:leftImage]; [leftItem setItemImageSize:CGSizeMake(20 * kXX, 20 * kXX)]; if ([target respondsToSelector:@selector(p_didClickLeftItemAction)]) { [leftItem addTarget:target action:@selector(p_didClickLeftItemAction) forControlEvents:UIControlEventTouchUpInside]; } LWNavigationBarItem *rightItem = [[LWNavigationBarItem alloc] initWithItemType:LWNavigationBarItemOnlyImage]; [rightItem setItemImage:rightImage]; [rightItem setItemImageSize:CGSizeMake(20 * kXX, 20 * kXX)]; if ([target respondsToSelector:@selector(p_didClickRightItemAction)]) { [rightItem addTarget:target action:@selector(p_didClickRightItemAction) forControlEvents:UIControlEventTouchUpInside]; } LWNavigationBarItem *titleItem = [[LWNavigationBarItem alloc] initWithItemType:LWNavigationBarItemOnlyText]; [titleItem setItemTitleColor:(style == YGNavigationBarStyleDefault ? [UIColor convertHexValueToColor:@"#2f2f2f"] : [UIColor whiteColor])]; [titleItem setItemTitle:titleText]; [titleItem setItemTitleFont:[UIFont fifteenOfSystem]]; LWNavigationBar *bar = [[LWNavigationBar alloc] init]; bar.backgroundColor = (style == YGNavigationBarStyleDefault ? [UIColor whiteColor] : [UIColor createNavigationColor]); [bar setBarContentInset:15 * kXX]; [bar addItemToTitle:titleItem]; [bar addItemToRight:rightItem]; [bar addItemToLeft:leftItem]; [bar setItemLineViewColor:YGViews_RGBA(182, 182, 182, 1.0)]; bar.frame = CGRectMake(0, 0, kScreenW, barHeight); [bar reloadItems]; [target.view addSubview:bar]; return bar; } 複製程式碼
總體而言,這些已經能滿足大多數需求,這裡我附上ofollow,noindex">Github連結
,如果感興趣,可以通過上述傳送門下載看一下,此外,LWNavigationBar
也支援pod,使用方式pod 'LWNavigationBar'
即可,如果覺得滿足你的需求,還望不吝一顆:sparkles:
,謝謝