項目介紹:
ZXNavigationBar
github:https://github.com/SmileZXLee/ZXNavigationBar
安裝
通過CocoaPods安裝
pod 'ZXNavigationBar'
或手動導入
-
將ZXNavigationBar拖入項目中。
導入頭文件
#import "ZXNavigationBarController.h"
功能&特點
-
[x] 每個控制器單獨管理自己的導航欄,導航欄屬于各個子控制器,不再屬于統一的導航控制器
-
[x] 兼容iOS8-iOS13,兼容各種設備,且無需擔心系統更新需要重新適配導航欄
-
[x] 僅需一行代碼即可輕松控制各種效果
-
[x] 支持隨時切換為系統導航欄,且與系統導航欄之間無縫銜接
-
[x] 支持在
ZXNavigationBar
上自定義titleView -
[x] 若
ZXNavigationBar
自帶效果都無法滿足,支持自定義導航欄 -
[x] 若從Xib中加載控制器,添加子View無需手動設置距離導航欄頂部約束,
ZXNavigationBar
會自動處理
效果預覽
導航欄設置 | 仿微博熱搜效果 | 自定義導航欄 | |
---|---|---|---|
![]() |
![]() |
![]() |
自定義titleView | 切換系統導航欄 | 可伸縮式導航欄 | |
---|---|---|---|
![]() |
![]() |
![]() |
開始使用
將控制器繼承于ZXNavigationBarController
,建議將Base控制器繼承于ZXNavigationBarController
@interface DemoBaseViewController : ZXNavigationBarController
@end
注意:ZXNavigationBar
會自動顯示返回按鈕,且實現點擊pop功能,您無需設置,若需要自定義返回按鈕,直接覆蓋self.zx_navLeftBtn
的圖片和點擊回調即可
關于自定義導航欄view內容無法自動下移的處理方式
-
如果是系統的導航欄,view的內容會自動下移,如64像素
-
設置了自定義的導航欄,它實際上就是普通的View,則view中的內容不會自動下移以避免擋住導航欄
-
ZXNavigationBar
的處理方法是: -
如果您是通過frame或者Masonry設置控件布局,請設置y距離頂部高度為導航欄高度,可直接使用
ZXNavBarHeight
這個宏 -
如果您是通過Xib加載控制器,則
ZXNavigationBar
會自動將內部約束設置為距離頂部為導航欄高度+原始高度,您無需作任何處理 -
若您是通過Xib加載控制器,且禁用了SafeArea,請設置:
//若大多數控制器都從Xib加載并禁用了SafeArea,可以直接在Base控制器中設置
self.zx_isEnableSafeArea = NO;
導航欄設置
設置導航欄標題
self.title = @"ZXNavigationBar";
或
self.zx_navTitle = @"ZXNavigationBar";
設置導航欄標題顏色
self.zx_navTitleLabel.textColor = @"ZXNavigationBar";
設置導航欄標題字體大小
self.zx_navTitleLabel.fontSize = [UIFont systemFontOfSize:20];
-
設置導航欄標題其他屬性,通過控制
self.zx_navTitleLabel
即可
快速設置左側/右側的按鈕(以右側按鈕為例)
-
設置最右側按鈕的圖片和點擊回調
[self zx_setRightBtnWithImgName:@"set_icon" clickedBlock:^(UIButton * _Nonnull btn) {
NSLog(@"點擊了最右側的Button");
}];
-
設置最右側按鈕的文字和點擊回調
[self zx_setRightBtnWithText:@"右側按鈕" clickedBlock:^(UIButton * _Nonnull btn) {
NSLog(@"點擊了最右側的Button");
}];
根據左側/右側的按鈕對象進行具體設置(以左側按鈕為例)
-
如果需要導航欄顯示返回圖標和返回文字
//由于ZXNavigationBar會自動在左側添加返回圖片和點擊返回事件,因此只需要設置返回的文字即可
[self.zx_navLeftBtn setTitle:@"返回" forState:UIControlStateNormal];
-
設置導航欄左側/右側的按鈕的其他非frame相關屬性,通過控制
self.zx_navLeftBtn/zx_navRightBtn
即可
將圖片渲染為指定顏色
//將oldImage渲染為紅色
UIImage *resultImage = [oldImage zx_renderingColor:[UIColor redColor]];
設置左側/右側的按鈕的大小
//將按鈕寬高設置為30
self.zx_navItemSize = 30;
設置左側/右側的按鈕的間距與邊距
//將按鈕邊距設置為0
self.zx_navItemMargin = 0;
設置右側第二個按鈕
-
將上訴例子中
zx_navLeftBtn
/zx_navRightBtn
修改為zx_navSubRightBtn
即可
設置導航欄背景顏色
self.zx_navBar.backgroundColor = [UIColor orangeColor];
設置導航欄背景圖片
self.zx_navBar.zx_bacImage = [UIImage imageNamed:@"nav_bac"];
設置導航欄漸變背景
//從magentaColor到cyanColor漸變
[self zx_setNavGradientBacFrom:[UIColor magentaColor] to:[UIColor cyanColor]];
移除導航欄漸變背景
[self zx_removeNavGradientBac];
設置導航欄TintColor(此屬性可以將導航欄的title顏色、左右Button的文字和圖片顏色修改為TintColor)
self.zx_navTintColor = [UIColor yellowColor];
設置導航欄大小標題效果
[self zx_setMultiTitle:@"ZXNavigationBar" subTitle:@"subTitle"];
設置分割線背景顏色
self.zx_navLineView.backgroundColor = [UIColor blueColor];
-
分割線其他其他非frame相關屬性通過
self.zx_navLineView
設置即可
設置伸縮式導航欄
-
如果設置了控制器的Xib且在Xib中設置了子視圖的約束(僅需設置展開或者折疊導航欄與動畫效果速度,無需手動調整控制器View子視圖的frame)
//第一個參數folded:控制是展開還是折疊導航欄;第二個參數speed:控制展開或收縮導航欄的速度,0-6,建議值為3;第三個參數offsetBlock:折疊動畫導航欄位移回調;第四個參數completionBlock:折疊動畫結束回調
[self zx_setNavFolded:YES speed:3 foldingOffsetBlock:nil foldCompletionBlock:nil];
-
如果是通過Frame設置控制器View的子視圖(如TableView),需要在
foldingOffsetBlock
回調中控制導航欄下方View的frame,使其始終緊貼導航欄底部
__weak typeof(self) weakSelf = self;
[self zx_setNavFolded:shouldFold speed:3 foldingOffsetBlock:^(CGFloat offset) {
//tableView的y值跟隨這導航欄變化(導航欄高度減小,tableView的y值減小)
weakSelf.tableView.y += offset;
//tableView的高度值跟隨這導航欄變化(導航欄高度減小,tableView高度增加)
weakSelf.tableView.height -= offset;
}
設置狀態欄為白色
self.zx_isLightStatusBar = YES;
設置狀態欄為黑色
self.zx_isLightStatusBar = NO;
顯示系統導航欄(默認為否)
//顯示系統導航欄將會自動隱藏ZXNavigationBar
self.zx_showSystemNavBar = YES;
隱藏ZXNavigationBar(默認為否)
//顯示系統導航欄將會自動隱藏ZXNavigationBar
self.zx_hideBaseNavBar = YES;
禁止Xib加載控制器情況下自動將頂部View約束下移導航欄高度(默認為否)
self.zx_disableNavAutoSafeLayout = YES;
自定義TitleView
//創建自定義View
UIView *customTitleView = [[UIView alloc]init];
[self zx_addCustomTitleView:customTitleView];
自定義導航欄View
//創建自定義View
UIView *customNav = [[UIView alloc]init];
[self zx_addCustomNavBar:customNav];