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;