如何完全自定義NavigationBar


  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的傳遞消息的方式感覺這是最優秀的了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM