打造一款靈活的導航欄

更新說明:LWNavigationBar已經更新,能夠支持自定義UIView做爲item,而且也支持對此種item的add,update等操做,支持update空的item,即傳入爲nil,視爲刪除操做,另更新了標題欄佈局適配問題 LWNavigationBar地址git

前言:項目中常常會遇到功能樣式各類各樣的導航欄,使用系統的也能達到需求,可是改動方面比較麻煩,特別是對於改動的時機把控問題較多,因此不少狀況下都是隱藏系統的導航欄,自定義一個view區代替導航欄,導航欄的樣式無非如下幾種:github

文字,圖片,與圖文混合,這幾種的組合bash

那麼如何打造一款適用的導航欄呢?筆者在項目中的需求,導航欄風格迥異,還牽扯到一些控件的漸變和隱藏效果,下面就來具體講解下封裝的過程。ide

筆者想到的封裝結構以下圖所示:佈局

LWNavigationBar結構圖

LNavigationItem

LWNavigationBar

整體設計如上圖所示,LWNavigationBarItem主要是對單體item的相關設置,包括item樣式,文字,圖片和其相關樣式的定製等 LWNavigationBar是承載LWNavigationBarItem的容器,對外提供增長,修改相關item的接口,內部實現對item的佈局,下面我截取相關樣式的圖片:ui

1.標題漸變

標題漸變1

標題漸變2

標題漸變3

2.帶下劃線的item

帶下劃線的item

3.動態修改item的隱藏顯示和內容

動態修改item1

動態修改item2

動態修改item3

還有其餘組合這裏就不一一列舉,能夠自行下載嘗試spa

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;
}
複製代碼

整體而言,這些已經能知足大多數需求,這裏我附上Github連接,若是感興趣,能夠經過上述傳送門下載看一下,此外,LWNavigationBar也支持pod,使用方式pod 'LWNavigationBar'便可,若是以爲知足你的需求,還望不吝一顆✨ ,謝謝3d

相關文章
相關標籤/搜索