自定义导航条的前提是隐藏系统自带的导航条
创建自定义的导航条视图,当前控制器将需要添加的东西告知自定义导航条视图,然后导航条视图去创建。
当前视图控制器做的事情
初始化需要添加到自定义导航条视图的对象
// 设置状态栏的风格
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
// 隐藏系统自带导航条
self.navigationController.navigationBarHidden = YES;
// [self.navigationController setNavigationBarHidden:YES];
UIView *redView = [[UIView alloc] init];
redView.frame = CGRectMake(0, 0, 50, 30);
redView.backgroundColor = [UIColor redColor];
// 自定义Item 左边Item
MyNavigationItem *leftItem1 = [[MyNavigationItem alloc] init];
leftItem1.itemTitle = @"left1";
leftItem1.itemBgImageName = @"buttonbar_action.png";
MyNavigationItem *leftItem2 = [[MyNavigationItem alloc] init];
leftItem2.itemTitle = @"left2";
leftItem2.itemBgImageName = @"buttonbar_action.png";
NSArray *leftItems = @[leftItem1,leftItem2];
// 自定义Item 右边Item
MyNavigationItem *rightItem1 = [[MyNavigationItem alloc] init];
rightItem1.itemTitle = @"right1";
rightItem1.itemBgImageName = @"buttonbar_action.png";
MyNavigationItem *rightItem2 = [[MyNavigationItem alloc] init];
rightItem2.itemTitle = @"right2";
rightItem2.itemBgImageName = @"buttonbar_action.png";
NSArray *rightItems = @[rightItem1,rightItem2];MyNavigationBar *myNavigationBar = [[MyNavigationBar alloc] init];
myNavigationBar.frame = CGRectMake(0, 20, 320, 44); // 之前的导航条的位置
[myNavigationBar creatrMyNavigationBarWithImageName:@"navigationbar.png"
title:nil
titleView:redView
leftItems:leftItems
rightItems:rightItems
class:self // 将事件的监听对象和事件的响应方法传递给myNavigatioBar 绑定
sel:@selector(itemClick:)];
[self.view addSubview:myNavigationBar];
}
自定义导航条视图创建和自定义标签栏视图大同小异 。
自定义导航条视图一般都比自定义标签栏视图麻烦一点,因为自定义导航条视图需要创建左右items,而自定义标签视图只需要创建按顺序排列的items。所以说自定义导航条视图需要判断items是在标题的左边还是右边,才能确定位置来创建
/**
* 自定义导航条
*
* @param bgImageName 有一个背景图片来创建背景视图
* @param title 自定义标题内容
* @param titleView 自定义标题视图
* @param leftItems 左边barButtonItem
* @param rightItems 右边barButtonItem
* @param classobject button绑定对象
* @param sel button响应事件
*/
- (void)creatrMyNavigationBarWithImageName:(NSString *)bgImageName
title:(NSString *)title
titleView:(UIView *)titleView
leftItems:(NSArray *)leftItems
rightItems:(NSArray *)rightItems
class:(id)classobject
sel:(SEL)sel {
// 1. 加载背景图片
[self creatBgImageViewWithBgImageName:bgImageName];
// 2. 设置标题
if (title.length > 0) { // 如果title存在,我们创建titleLabel
[self createTitleLabelWithTitle:title];
}
// 3. 设置标题视图
if (titleView) {
[self createTitleViewWithView:titleView];
}
// 4. 设置items
// 左边起始值
CGFloat itemx = 0.0f;
// 右边起始值
CGFloat itemx2 = 320.0f;
if (leftItems.count > 0) {
for (int i = 0; i < leftItems.count; i++) {
// 创建导航条中的导航条目 左边
itemx = [self createItemWithNavigationItem:[leftItems objectAtIndex:i] isLeft:YES index:i x:itemx + 5.f class:classobject sel:sel];
// 左边每次创建完1个都要返回其图片右边的位置 方便下一个创建安排位置
}
}
if (rightItems.count > 0) {
for (int j = 0; j < rightItems.count; j++) {
// 创建导航条中的导航条目 右边
itemx2 = [self createItemWithNavigationItem:[rightItems objectAtIndex:j] isLeft:NO index:j x:itemx2 - 5.f class:classobject sel:sel];
// 右边每次创建完1个都要返回其图片左边的位置 方便下一个创建安排位置
}
}
}
/** 创建背景视图 */
- (void)creatBgImageViewWithBgImageName:(NSString *)bgImageName {
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:bgImageName]];
NSLog(@"%f %f %f %f",self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
NSLog(@"%f %f %f %f",self.bounds.origin.x,self.bounds.origin.y,self.bounds.size.width,self.bounds.size.height);
// bounds xy不管怎么设置都是原点
/**
* 因为此imageView 需要加到 self 上
所以如果想要和self 位置相同,就必须要要设置frame为self的bounds
因为子视图的frame是以父视图为参照的,
*/
imageView.frame = self.bounds;
[self addSubview:imageView];
}
/** 标题 */
- (void)createTitleLabelWithTitle:(NSString *)title {
UILabel *label = [[UILabel alloc] init];
// label大小
label.frame = self.bounds;
// label内容
label.text = title;
// label对齐方式
label.textAlignment = NSTextAlignmentCenter;
// label字体样式
label.font = [UIFont boldSystemFontOfSize:28];
label.textColor = [UIColor colorWithRed:00.0f green:0.62f blue:0.92f alpha:1.00f];
[self addSubview:label];
}
/** 标题视图 */
- (void)createTitleViewWithView:(UIView *)view {
NSLog(@"%f",self.center.x);
NSLog(@"%f",self.center.y);
NSLog(@"%f",self.frame.size.height/2);
view.center = CGPointMake(self.center.x, self.frame.size.height/2);
// 子视图的位置以父视图为参照,
NSLog(@"%f %f %f %f",view.frame.origin.x,view.frame.origin.y,view.frame.size.width,view.frame.size.height);
NSLog(@"%f %f %f %f",view.bounds.origin.x,view.bounds.origin.y,view.bounds.size.width,view.bounds.size.height);
[self addSubview:view];
}
/** 创建item */ // 返回一个x坐标
/**
* 创建item们
*
* @param item 提供imte名字和图片名字
* @param isLeft 判断是否为左边item以便安排左边
* @param index 给button一个tag
* @param x item按钮的起始位置
* @param classObject 事件的监听对象
* @param sel 事件的方法
*
* @return <#return value description#>
*/
- (CGFloat)createItemWithNavigationItem:(MyNavigationItem *)item
isLeft:(BOOL)isLeft
index:(int)index
x:(CGFloat)x
class:(id)classObject
sel:(SEL)sel {
// 取到item的背景图片
NSString *bgImageName = item.itemBgImageName;
UIImage *bgImage = [UIImage imageNamed:bgImageName];
// 自定义button
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
if (!isLeft) {
button.frame = CGRectMake(x - bgImage.size.width, (self.bounds.size.height-bgImage.size.height)/2, bgImage.size.width, bgImage.size.height); // 子视图y对应父视图 父视图高/2-子视图高/2
} else {
button.frame = CGRectMake(x , (self.bounds.size.height-bgImage.size.height)/2, bgImage.size.width, bgImage.size.height);
}
// 设置标题
[button setTitle:item.itemTitle forState:UIControlStateNormal];
// 设置背景图片
[button setBackgroundImage:bgImage forState:UIControlStateNormal];
// 添加事件
// classObject - > viewController
// sel - > viewController 要执行的事件
[button addTarget:classObject action:sel forControlEvents:UIControlEventTouchUpInside];
button.tag = index;
[self addSubview:button];
if (!isLeft) {
return x - bgImage.size.width;
} else {
return x + bgImage.size.width;
}
}
















