NavigationBar是很常用的一個元素,所以常常需要進行自定義操作,而一種比較直觀的方式就是,先定義一個類NavigationBar繼承自UINavigationBar,而這個NavigationBar的內部內容則是比較復雜的了,里面添加我們需要的所有的navigationBar 的樣式,而且使得這些view的尺寸都是整個NavigationBar的尺寸,然后再進行內部view的構建就可以了,而需要進行切換的時候就進行這些view之間的顯示和隱藏的切換就可以了,最好使用一些動畫,前面的文中有提供動畫流暢的保證方式,現在新建一個HomeNavigationController 繼承自UINavigationController,並且在這個類的實現中這樣操作
@implementation HomeNavigationController -(instancetype)init { self = [super initWithNavigationBarClass:[Navigationbar class] toolbarClass:nil]; if (self) { self.delegate = self; } return self; }
這樣的話就將HomeNavigationController的導航欄的樣式進行了確定了。而為了能進行子控制器的導航欄的正確顯示,最好在HomeNavigationController中聲明一個
@protocol SecretPresentableViewController <NSObject> @optional - (void)willPresentWithNavigationBar:(Navigationbar *)navigationBar; @end
而那些想要擁有這個導航欄的自控制器只需要實現協議就可以了,而NavigationBar中的多個view的左右按鈕以及中間都可以完全的自定義了,而事件 的傳遞則使用block的方式,這里提供其中一個自定義view的h定義方式
@interface HomeNavigationView : UIView @property(nonatomic, copy) void (^didTapComposeBlock)(void); @property(nonatomic, copy) void (^didTapNotificationsBlock)(void); @property(nonatomic, copy) void (^didTapChatBlock)(void); @property(nonatomic, copy) void (^didTapScrollToTopBlock)(void); @property(nonatomic, copy) void (^didTapNewThemeTopBlock)(void); @property (nonatomic, strong) UILabel* titleLabel; @property (nonatomic, strong) UIButton *tipsNewThemeBtn; @property (nonatomic, strong) UIButton *unreadLeftV; @end
而在m文件中只要對按鈕添加監聽就可以了,例子是
#pragma private -(void)left:(id)sender { if (_didTapNotificationsBlock) _didTapNotificationsBlock(); }
在擁有navigationBar 的控制器中對具體的block進行處理
navigationBar.homeNavigationView.didTapNotificationsBlock = ^{
[self left:nil];
};
而里面使用的這個left:方法則正是這個控制器中的具體的處理方法(push,modal,或者按鈕的消失,lable的隱藏等等的點擊相應等等),這樣的話就實現了自定義bar的同時而且實現了bar和控制器之間的無縫銜接。更加方便的進行自定義的操作,但同時也可以完全實現系統提供bar的所有功能等等,而這個具體的實現過程很有可能就是apple自己內部的實現方式,因為apple很推薦我們使用block而這種bar和viewcontrol的傳遞消息的方式感覺這是最優秀的了。