如何完全自定义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的传递消息的方式感觉这是最优秀的了。

时间: 2024-08-29 06:10:28

如何完全自定义NavigationBar的相关文章

iOS自定义NavigationBar

日常开发中少不了用到UINavigationController,但是很多情况都要自定义NavigationBar.依稀记得自己刚开始也踩了好多坑,凑今天有空,就把想到的写下来.有时间了,考虑再把自定义TabBar写一下. 1.修改Navigationbar navigationBar其实有三个子视图,leftBarButtonItem,rightBarButtonItem,以及titleView. 1.1  方法一:alloc一个UINavigationBar ,并给alloc出来的Navig

iOS8 自定义navigationbar 以及 UIBarButtonItem 边距问题

一.自定义navigationbar - (void)initNavigationBar{ [self.navigationController setNavigationBarHidden:YES]; UINavigationBar *bar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 32)]; [bar setBackgroundImage:[UIImage imageNamed:@"zhuche_bar2.

UINavigationController自定义navigationbar的2种思路

/* 设计自定义导航控制器的navigationbar的2种方法 1.首先将navigationbar隐藏,然后写个父类的viewcontroller,里面有个组件就是头部那块组件.充当navigationbar,银海的项目都是这种 2.首先将navigationbar隐藏,然后在navigationcontroller的view上面放个view来充当navigationbar.也在viewcontroller很容易找到这个view(其他地方也能找到,写个父类保存,就是为了减少代码冗长而已),再

如何Android中自定义Navigationbar

在如何控制android系统中NavigationBar 的显示与隐藏文章里简要地介绍了Navigationbar的背景知识, NavigationBar的代码是放在...\frameworks\base\packages\SystemUI\路径下面的.该路径下的工程主要负责手机中系统级UI的显示部分,如下图框中选中部分(包含其中的通知栏的显示),USB的连接,截屏等等. NavigationBar的创建 navigationbar 的代码是在SystemUI工程SystemUI/src/com

自定义navigationbar

UINavigationBar *bar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, kDeviceWidth, 64)]; [bar setBackgroundImage:[UIImage imageNamed:@"blackbg"] forBarMetrics:UIBarMetricsDefault]; UINavigationItem *item = [[UINavigationItem alloc] ini

iOS 自定义NavigationBar右侧按钮rightBarButtonItem--button

//两个按钮的父类view UIView *rightButtonView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)]; //历史浏览按钮 UIButton *historyBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; [rightButtonView addSubview:historyBtn]; [historyBtn setImage

关于iOS7.0以后修改navigationBar的返回按钮的文本、颜色、自定义按钮等等

1.返回按钮的颜色 self.navigationController.navigationBar.tintColor = [UIColor whiteColor]; 2.设置返回按钮的内容 A -> B 在push的时候,在A中添加代码: UIBarButtonItem *backItem = [[UIBarButtonItem alloc] init]; backItem.title = @"你的文字"; self.navigationItem.backBarButtonIt

iOS7自定义statusbar和navigationbar的若干问题

当然有许多问题是这篇文章中没有提到的,按照文章的方法进行设置,你可能会遇到以下问题: 1.navigationbar的背景图片自定义以后,statusbar虽然和navigationbar共用了背景图,但是其还是透明的,颜色会比navigationbar淡许多,导致最终效果很难看,那么如何修复这个问题呢?很简单调用以下方法: self.navigationController.navigationBar.translucent = NO; 此时navigationbar和statusbar就融为

自定义返回按钮

iOS如何把导航默认的返回按钮设置成“返回” 自定义iOS7导航栏背景,标题和返回按钮文字颜色 ios4及ios5下自定义NavigationBar的返回按钮 iOS 5自定义控件