在我的项目里经常会遇到自定义导航栏的返回按钮,以及设置导航栏的背景为透明。
但是这样子设置会遇到两个问题:
1.如果设置不当,返回的手势交互会不能用。
2.导航栏透明的状态和不透明状态切换很麻烦,而且效果不好。
在这里我分享一种解决办法,供大家参考:
首先你要创建一个BaseViewController,这样你的一些基础的设置都可以在这个Controller里面进行了。
BaseViewController的h文件
@interface BaseViewController : UIViewController<UIGestureRecognizerDelegate>
//返回按钮的pop
-(void)viewWillBack;
//这个作为透明导航栏下面的颜色设置view;
@property (nonatomic, strong) UIView *NavBarView;
@end
BaseViewController的m文件
- (void)viewDidLoad
{
[super viewDidLoad];
//开启交互手势,我一般是在自定义的导航栏里面设置的,UIGestureRecognizerDelegate
self.navigationController.interactivePopGestureRecognizer.delegate = self;
//设置导航栏为透明颜色
[self.navigationController.navigationBar setBackgroundImage:[UIImage createImageWithColor:[UIColor clearColor]] forBarMetrics:UIBarMetricsDefault];
//创建底部的导航栏试图
[self bulidNavBarView];
//第一个控制器不需要加返回按钮
if ([[self.navigationController viewControllers] count] > 1) {
[self resetBackBarButton];
}
}
-(void)viewWillBack
{
[self.navigationController popViewControllerAnimated:YES];
}
//设置返回按钮
- (void)resetBackBarButton
{
UIButton *leftBarButton = [UIButton buttonWithType:UIButtonTypeCustom];
leftBarButton.frame = CGRectMake(0, 0, 40, 40);
[leftBarButton setImage:[[UIImage imageNamed:@"nav_back"] imageWithOverlayColor:[UIColor whiteColor]] forState:UIControlStateNormal];
[leftBarButton addTarget:self action:@selector(viewWillBack) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:leftBarButton];
//用于调整返回按钮的位置
UIBarButtonItem *space_item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
space_item.width = -10;
//通过这个方法设置,手势返回的操作就不会关闭了
self.navigationItem.leftBarButtonItems = @[space_item, item];
}
接下来就是在BaseViewController的顶部加上一个NavBarView
//当然如果你要加图片可以换成UIImageView
- (void)bulidNavBarView{
//如果这里导航栏设置成半透明就是0,如果不是半透明就是-64,可以根据实际情况调整,就是要放在view顶部
self.navBarView = [[UIView alloc]initWithFrame:CGRectMake(0, -64, [UIScreen mainScreen].bounds.size.width, 64)];
//设置颜色为白色;
self.navBarView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.navBarBgView];
}
控制导航底部的阴影线条
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//隐藏
self.navigationController.navigationBar.shadowImage = [UIImage new];
//如果现实的话换一张阴影的图片就可以了
}
当然有可能还需要设置导航栏的其他属性,所以我喜欢创建一个MainNavigationController,这个里面来统一设置
//设置导航栏标题的颜色和字体
NSDictionary * dict = @{
NSFontAttributeName:[UIFont systemFontOfSize:17],
NSForegroundColorAttributeName:color
};
self.navigationBar.titleTextAttributes = dict;
运用导航栏的代理方法UINavigationControllerDelegate来进行push之后隐藏Tabbar的操作
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
viewController.hidesBottomBarWhenPushed = YES;
[super pushViewController:viewController animated:animated];
viewController.hidesBottomBarWhenPushed = NO;
}
- (UIViewController *)popViewControllerAnimated:(BOOL)animated{
UIViewController *viewCol = [super popViewControllerAnimated:animated];
if (self.viewControllers.count == 1) {
viewCol.tabBarController.tabBar.hidden = NO;
}else{
viewCol.tabBarController.tabBar.hidden = YES;
}
return viewCol;
}
可能上面并不是最好的解决方案,如果你们有什么好的建议可以互相学习,不足之处还请见谅。