UI要求不高时,我们用官方的导航栏就足够用了,但是如果想创建一个更多样化,拥有更多功能的导航栏就需要自己创建了。
准备工作:
在StoryBoard中
①删除主视图(这时启动的小箭头也消失了)
②拖入一个Nav Controller连接MyNAV类
③设置从此视图开始启动
接下来,开始自定义导航栏
1.创建继承自UINavigationController的子类
2.创建继承自UIView的子类,并生成Xib文件
UIView无法直接生成Xib文件 小菊花+N 找到Empty
注意:方法名要与UIView文件名一致
将Xib文件的类与UIView相连接
拖进来一个UIView 将其SIZE设置为自定义FreeForm,这时就可以自行修改视图的大小了。
我这里将其宽高改为320*64,左右各拖了一个button,中间是一个label
将其中的两个button连接到MyNavBarView.h中,将其点击事件添加到MyNavBarView.m中
MyNavBarView.h
@property (weak, nonatomic) IBOutlet UIButton *btn_back;
@property (weak, nonatomic) IBOutlet UIButton *btn_edit;
MyNavBarView.m
- (IBAction)ClickBack:(id)sender {
}
- (IBAction)ClickEdit:(id)sender {
}
3.在MyNAV.h文件中,将类MyNavBarVie当做其属性
@property(nonatomic,strong)MyNavBarView*MyNv;
4.在MyNAV.m文件
①隐藏系统生成的导航栏
②添加自定义的导航栏
//隐藏系统生成的导航栏
[self setNavigationBarHidden:YES];
//添加自定义的导航栏
self.MyNv=[[[NSBundle mainBundle]loadNibNamed:@"MyNavBarView" owner:nil options:nil]
lastObject];
//设置导航栏的位置
self.MyNv.frame=CGRectMake(0, 0, 320, 64);
//添加到self.view
[self.view addSubview:self.MyNv];
这样就成功的生成了一个有自定义导航栏的NAV
这时两个按钮还没有对应的响应方法,我们想通过点击返回键回到上一层页面(当然了,这里它没有上一层页面),通过点击编辑进入到其他页面。简而言之,也就是说我们想通过MyNavBarView中的按键来完成整个可视界面的跳转,那么这时就需要用到"代理",来完成它本身无法实现的功能。
代理一共六步。
准备工作:
①创建继承自UITableViewController的文件
②将StoryBoard里的TableViewController和创建的文件连接
开始设置代理:
MyNavBarView.h文件中
1.声明要代理的方法
@protocol MyNavBarViewDelegate <NSObject>
-(void)ClickBack;
-(void)ClickEdit;
@end
2.把它当做自己的属性
@property(weak,nonatomic)id<MyNavBarViewDelegate>delegate;
MyNavBarView.m文件中
3.判断它是否存在、是否响应,并且实现这个方法
- (IBAction)ClickBack:(id)sender {
if (_delegate&&[_delegate respondsToSelector:@selector(ClickBack)]) {
[_delegate ClickBack];
}
}
- (IBAction)ClickEdit:(id)sender {
if (_delegate&&[_delegate respondsToSelector:@selector(ClickEdit)]) {
[_delegate ClickEdit];
}
}
4.引入头文件(因为MyNavBarView是MyNAV的属性所以直接引入MyNAV.h即可),使用代理方法
#import "MyNAV.h"
@interface TableViewController ()<MyNavBarViewDelegate>
5.
( (MyNAV*)self.navigationController).MyNv.delegate=self;
//由于直接调用的navigationController是系统自己生成的,我们要用强转将其变成MyNAV类型
6.实现代理方法
//由于我这里没有设置其他界面,用两个输出语句代替
-(void)ClickBack{
NSLog(@"Back");
}
-(void)ClickEdit{
NSLog(@"Edit");
}
以上就是自定义导航栏的设置方法