iOS中导航栏的基本使用汇总
支付宝注销iOS中导航栏的基本使⽤汇总
⽬录
⼀、设置导航栏样式
⼆、解决⾃定义导航栏返回按钮后侧滑不可⽤问题
三、隐藏导航栏底部的分割线
四、导航栏引起的布局问题
⼀、设置导航栏样式
设置导航栏的样式可分为全局设置与局部设置;
1.全局设置
全局设置⼀般的都是在AppDelegate中设置,这样整个app都会⽣效,相关的代码与效果图如下:
//1.设置导航栏背景颜⾊
巨石强森的电影
[[UINavigationBar appearance] setBarTintColor:[UIColor orangeColor]];
//2.设置导航栏背景图⽚
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigationBarImg"] forBarMetrics:UIBarMetricsDefault];
//3.设置导航栏标题样式
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor purpleColor], NSForegroundColorAttributeName,
[UIFont boldSystemFontOfSize:25], NSFontAttributeName, nil]];
//4.设置导航栏返回按钮的颜⾊
[[UINavigationBar appearance] setTintColor:[UIColor greenColor]];
//5.设置导航栏隐藏
[[UINavigationBar appearance] setHidden:YES];
设置导航栏样式效果图
2.局部设置:
全局设置后,如果只有其中⼏个页⾯导航栏样式不同,那么我们可以使⽤局部设置。
注意1:局部设置与全局设置⽅法相同,但调⽤⽅法的对象变成了"self.navigationController.navigationBar"
注意2:局部设置必须遵循⼀个原则:"进⼊页⾯时修改,离开页⾯时还原”。
⽐如我们进⼊⼀个页⾯,需要设置当前导航栏的背景⾊为灰⾊,使⽤如下⽅法:
//进⼊页⾯时设置颜⾊:灰⾊
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController.navigationBar setBarTintColor:[UIColor grayColor]];
}
//离开页⾯时还原为全局设置:橙⾊
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];今年元旦高速免费吗
[self.navigationController.navigationBar setBarTintColor:[UIColor orangeColor]];
}
⼆、解决⾃定义导航栏返回按钮后侧滑不可⽤问题
iOS导航栏⾃带的返回按钮形式单⼀,所以⼤多情况下,我们都需要⾃定义导航栏返回按钮。但是此时我们却发现页⾯的侧滑返回功能不可⽤了。为了解决这个问题,我们需要在App中使⽤我们⾃定义的导航控制控制器,⽰例代码如下:
#import “BaseNavigationController.h"
//第⼀步:设置⾃定义导航控制器使⽤UIGestureRecognizerDelegate
@interface BaseNavigationController ()<UIGestureRecognizerDelegate>
@end
@implementation BaseNavigationController
- (void)viewDidLoad {
[super viewDidLoad];
//第⼆步:设置⾃定义导航控制器的侧滑⼿势的代理清蒸螃蟹
cs1.6带机器人self.interactivePopGestureRecognizer.delegate = self;
}
//第三步:实现代理⽅法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
if (unt == 1) {
// 表⽰⽤户在根控制器界⾯,就不需要触发滑动⼿势,
return NO;
}
return YES;
}
@end
三、隐藏导航栏底部的分割线
隐藏导航底部分割线也是我们偶尔会遇到的开发需求,⾸先我们可以通过Xcode的Debug View Hierarchy功能查看导航栏的视图结构,效果如下:
导航栏视图层级图
从图中可以看出,导航栏的底部分割线是⼀个UIImageView对象,⽽且⾼度只有0.5,所以我们可以据此获取到导航栏的底部分割线对象,在⼀个视图控制器中实现此需求,代码如下:
#import "TestViewController.h"
@interface TestViewController ()
//第⼀步:设置⼀个属性,存放导航栏底部分割线对象
@property (nonatomic, strong) UIImageView *navBarBottomImage;
@end
@implementation TestViewController
- (void)viewDidLoad {
[super viewDidLoad];
////第三步:获取导航栏底部分割线对象
UIImageView *navBarBottomImage = [self findNavBarBottomImage:self.navigationController.navigationBar];
self.navBarBottomImage = navBarBottomImage;
}
//第四步:设置分割线的显⽰或隐藏
//进⼊页⾯隐藏分割线
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.navBarBottomImage.hidden = YES;
}
//离开页⾯时显⽰分割线
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
self.navBarBottomImage.hidden = NO;
}
/
/第⼆步:添加⽤于获取导航栏分割线的⽅法
//导航栏底部分割线是⼀个UIImageView,且⾼度不超过1.0个⾼度,可据此查此对象
-(UIImageView *)findNavBarBottomImage:(UIView *)view {
if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
return (UIImageView *)view;
}
for (UIView *subview in view.subviews) {
UIImageView *imageView = [self findNavBarBottomImage:subview];
if (imageView) {
return imageView;
}
}
return nil;
}
四、导航栏引起的布局问题
1.内容偏移属性:automaticallyAdjustsScrollViewInsets
automaticallyAdjustsScrollViewInsets是视图控制器的⼀个属性,默认为YES,⽤于优化滑动类视图(继承于UIScrollView的视图)在视图控制⾥的显⽰:iOS系统的导航栏UINavigationBar与标签栏UITabBar默认都是半透明模糊效果,在这种情况下系统会对视图控制器的UI布局进⾏优化:视图控制器⾥⾯第⼀个被添加进去的视图是滑动类视图,并且其Frame是整个屏幕⼤⼩时,系统会⾃动调整其contenInset,以保证滑动视图⾥的内容不被UINavigationBar与UITabBar遮挡。
但是对于普通的视图,此时我们仍然需要注意:⾮滑动视图的布局仍然要考虑导航栏和标签栏⾼度,注意不被遮挡,⽐如布局的时候加上导航栏⾼度,
以免内容被导航栏遮挡。
我们可以通过⼀段代码来测试⼀下效果,在默认导航栏(半透明)的视图控制器⾥添加如下代码:
//UITextView是滑动视图,内容⾃动向下偏移,不会被导航栏覆盖
UITextView *leftTextView = [[UITextView alloc] init];
leftTextView.frame = CGRectMake(0, 0,100, kDeviceHeight); //
leftTextView.backgroundColor = [UIColor lightGrayColor];
< = @"君不见,黄河之⽔天上来,奔流到海不复回。君不见,⾼堂明镜悲⽩发,朝如青丝暮成雪。⼈⽣得意须尽欢,莫使⾦樽空对⽉。天⽣我材必有⽤,千⾦散尽还复来。"; leftTextView.font = [UIFont systemFontOfSize:18];
leftTextView.editable = NO;
[self.view addSubview:leftTextView];榜样4人物介绍
//UIView是⾮滑动视图,内容被导航栏部分覆盖
UIView *rightView= [[UIView alloc] initWithFrame:CGRectMake(150, 0, 100, 100)];
rightView.backgroundColor = [UIColor redColor];
[self.view addSubview:rightView];
导航栏透明情况下,滑动视图⾃动偏移,普通视图被遮挡
其实,这种系统的优化也是可以控制关闭的,关闭优化之后,滑动视图就会和普通视图⼀样,如果还设置其布局的原点是(0,0),其内容就会被导航栏所覆盖,关键代码如下:
//automaticallyAdjustsScrollViewInsets在11.0后失效,所以需要判断
if (@available(iOS 11.0,*)) {
}else{
//automaticallyAdjustsScrollViewIn,关闭⾃动偏移的系统优化
self.automaticallyAdjustsScrollViewInsets = NO;
}
2.边缘延伸属性:edgesForExtendedLayout
edgesForExtendedLayout也是视图控制器的布局属性,默认值是UIRectEdgeAll,即:当前视图控制器⾥各种UI控件会忽略导航栏和标签的存在,布局时若设置其原点设置为(0,0),视图会延伸显⽰到导航栏的下⾯被覆盖。
所以我们可以设置self.edgesForExtendedLayout=UIRectEdgeNone,此时视图控制器⾥内容就会避开导航栏和标签栏了,依然是上⾯的leftTextView和rightView,设置了UIRectEdgeNone之后的效果图如下:
self.edgesForExtendedLayout=UIRectEdgeNone
3.导航栏透明属性translucent
上述两种属性都是在解决导航栏半透明情况下的布局问题,但是如果我们的需求就是导航栏不透明,那么视图控制器⾥的控件就会默认从(0,64)开始布局了,设置导航栏不透明的⽅法如下:
self.anslucent= NO;
相关⽂章:
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。