zoukankan      html  css  js  c++  java
  • 如何完全自定义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的传递消息的方式感觉这是最优秀的了。

  • 相关阅读:
    Codeforces 834D The Bakery
    hdu 1394 Minimum Inversion Number
    Codeforces 837E Vasya's Function
    Codeforces 837D Round Subset
    Codeforces 825E Minimal Labels
    Codeforces 437D The Child and Zoo
    Codeforces 822D My pretty girl Noora
    Codeforces 799D Field expansion
    Codeforces 438D The Child and Sequence
    Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D)
  • 原文地址:https://www.cnblogs.com/azxfire/p/4095487.html
Copyright © 2011-2022 走看看