1. 导航栏三个区域
UINavigationController *nav;
nav.navigationBar;// 导航区
nav.viewControllers;//内容区
nav.toolbar;//工具区(默认隐藏)
self.navigationController.toolbarHidden = NO; 显示导航区
1.1 导航区
iOS7.0前, 导航条拟物化风格, 不透明 (内容区在导航条下:64开始)
iOS7.0后, 扁平化风格,导航栏模式是透明的(0/64)
1.1.1 透明 内容(0)开始;
1.1.2 透明 内容(64)开始 (0, iPhonex 84);
1.1.3 不透明 内容全局 (0)
1.1.4 不透明 内容从64开始 (0)
// 透明全局(默认)
- (void)translucentAndAll {
self.navigationController.navigationBar.translucent = YES;
self.edgesForExtendedLayout = UIRectEdgeAll;
// self.automaticallyAdjustsScrollViewInsets = YES;
// self.extendedLayoutIncludesOpaqueBars = NO; // 是否包含透明的bar
}
// 透明 64
- (void)translucentAnd64 {
self.navigationController.navigationBar.translucent = YES;
self.edgesForExtendedLayout = UIRectEdgeTop;
}
// 不透明 全局
- (void)noTranslucentAndAll {
self.navigationController.navigationBar.translucent = NO;
// self.edgesForExtendedLayout = UIRectEdgeAll;
}
// 不透明 64
- (void)noTranslucentAnd64 {
self.navigationController.navigationBar.translucent = NO;
self.extendedLayoutIncludesOpaqueBars = YES;
}
2. 导航控制器跳转
NSMutableArray *array = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[array removeLastObject];
[array removeLastObject];
self.navigationController.viewControllers = array;
[self.navigationController popViewControllerAnimated:YES];
3. NavigationBar
3.1 设置导航条透明度
- (void)translucentStyle {
[self.navigationController.navigationBar setBackgroundImage:[self image] forBarMetrics:UIBarMetricsDefault];
}
- (UIImage *)image {
UIGraphicsBeginImageContext(CGSizeMake(100, 100));
// _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
// 设置为1 会影响scrollView的bounds (0,0,width,height)
// 少于 1 scrollView的bounds (0,64,width,height)
[[[UIColor whiteColor] colorWithAlphaComponent:0.99] setFill];
UIRectFill(CGRectMake(0, 0, 100, 100));
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
另外一种方式通过修改_UIBarBackground类来进行修改透明度,稍稍复杂些
4. 黑线处理
4.1 通过视图观察,黑线超过导航条的边框,可以通过clipToBounds来处理
self.navigationController.navigationBar.clipsToBounds = YES;
4.2 找到黑色的imageV ,然后设置hidden属性YES;
- (UIImageView *)findBlackLineImageV:(UIView *)view {
if ([view isKindOfClass:[UIImageView class]] && view.frame.size.height <= 1) {
return (UIImageView *)view;
}
NSArray *viewArr = view.subviews;
for (int i = 0; i < viewArr.count; i++) {
UIView *tempV = [self findBlackLineImageV:viewArr[i]];
if (tempV) {
return (UIImageView *)tempV;
}
}
return nil;
}
5. 导航条按钮
5.1 右按钮
NSMutableArray *barItems = [NSMutableArray array];
UIBarButtonItem *barItem1 = [[UIBarButtonItem alloc] initWithTitle:@"111" style:UIBarButtonItemStylePlain target:self action:nil];
UIBarButtonItem *barItem2 = [[UIBarButtonItem alloc] initWithTitle:@"222" style:UIBarButtonItemStylePlain target:self action:nil];
UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:self action:nil];
spaceItem.width = 10;
[barItems addObject:barItem1];
[barItems addObject:spaceItem];
[barItems addObject:barItem2];
self.navigationItem.rightBarButtonItems = barItems;
5.2 左按钮
- (void)backArrowImage {
UIImage *image = [UIImage imageNamed:@"[email protected]"];
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; //重要, 不然颜色会跟随导航条
self.navigationController.navigationBar.backIndicatorImage = image;
self.navigationController.navigationBar.backIndicatorTransitionMaskImage = image;
}
6. 导航栏隐藏
一种对view进行操作, 一种是控制器的属性(系统做了移除操作,位置改变等)
// 两种方式的不同
self.navigationController.navigationBar.hidden = YES;
self.navigationController.navigationBarHidden = YES;