交互全局iOS传道iOS收藏

iOS导航栏自定义返回按钮和设置导航栏透明交互

2016-08-10  本文已影响1386人  XH小子

在我的项目里经常会遇到自定义导航栏的返回按钮,以及设置导航栏的背景为透明。
但是这样子设置会遇到两个问题:
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;
}

可能上面并不是最好的解决方案,如果你们有什么好的建议可以互相学习,不足之处还请见谅。

上一篇下一篇

猜你喜欢

热点阅读