ios 自定導航欄 返回按鈕

 導航控制器 默認 返回鍵盤默認是  一個箭頭 + 上一個控制器名稱,系統默認,如下圖


  如何自定義左上角控制器返回按鈕:

  解決方法: 
A控制器進入detail控制器

- (IBAction)showDatail:(id)sender {
    // 注意: 控制器背景色不要在這裏設置
    AControllerViewController* aController=[[AControllerViewController alloc] init];
    aController.hidesBottomBarWhenPushed=YES;
    [self.navigationController pushViewController:aController animated:YES];
    
}

Detail控制器:


#import "AControllerViewController.h"

@interface AControllerViewController ()

@end

@implementation AControllerViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.navigationItem.title=@"詳情控制器";
    
    // 左上角
      UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
      [backButton setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
      [backButton setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
      [backButton setTitle:@"返回" forState:UIControlStateNormal];
      [backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
      [backButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
      [backButton sizeToFit];
      // 這句代碼放在sizeToFit後面
      backButton.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0);
      [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
      self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}


- (void)back
{
    [self.navigationController popViewControllerAnimated:YES];
}


@end

 效果圖: 

  

問題:  需要在每一個控制器中寫上面代碼,一個項目有很多控制器
  解決方法1: 
  使用繼承,BaseViewController 繼承 UIViewController, 但是如果是UITableViewController
  無法使用, 要寫 2個 繼承的 子類 BaseTableViewController
  解決2:
  自定義導航控制器,重寫 pushViewController方法 

自定義的時候注意點: 

1. 自定義 leftBarButtonItem 以後, 默認右滑關閉控制器頁面功能無效
 解決: 把手勢加上即可

2. 不要在控制外面設置 控制器背景顏色, 
比如在 XMGTabBarController 設置  tab控制器顏色,A,B,C,B 到時控制器 都初始化,而不是顯示的時候才初始化對應控制器

3. 如果A到 B控制器,B控制器 導航欄透明,那麼可以看到A控制器透過 B 控制器,那麼設置 導航欄 背景圖片 即可
 XMGNavigationController 自定義 NavigationController


#import "XMGNavigationController.h"

@interface XMGNavigationController () <UIGestureRecognizerDelegate>

@end

@implementation XMGNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    // 1. 自定義 leftBarButtonItem 以後, 默認右滑關閉控制器頁面功能無效 解決 把手勢加上即可
    self.interactivePopGestureRecognizer.delegate = self;
    // 3. 如果A到 B控制器,B控制器 導航欄透明,那麼可以看到A控制器透過 B 控制器,那麼設置 導航欄 背景圖片 即可
    [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
}

/**
 *  重寫push方法的目的 : 攔截所有push進來的子控制器
 *
 *  @param viewController 剛剛push進來的子控制器
 */
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // 必須判斷
    /*
     TwoController *twoVC= [[TwoController alloc]init];
        UINavigationController* twoVCN= [[XMGNavigationController alloc] initWithRootViewController:twoVC];
           twoVCN.tabBarItem.title=@"B控制器";
           [self addChildViewController:twoVCN];
     執行該代碼的時候也會執行  pushViewController,導航控制器下的控制器不能帶返回
     */
    if (self.childViewControllers.count > 0) { // 如果viewController不是最早push進來的子控制器
        // 左上角
        UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [backButton setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
        [backButton setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
        [backButton setTitle:@"返回" forState:UIControlStateNormal];
        [backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [backButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
        [backButton sizeToFit];
        // 這句代碼放在sizeToFit後面
        backButton.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0);
        [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
        
        // 隱藏底部的工具條
        viewController.hidesBottomBarWhenPushed = YES;
    }
    
    // 所有設置搞定後, 再push控制器
    [super pushViewController:viewController animated:animated];
}

//- (UIViewController *)popViewControllerAnimated:(BOOL)animated
//{
//    return [super popViewControllerAnimated:NO];
//}
//
//- (NSArray<UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
//{
//    return [super popToViewController:viewController animated:NO];
//}
//
//- (NSArray<UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated
//{
//    return [super popToRootViewControllerAnimated:NO];
//}

- (void)back
{
    [self popViewControllerAnimated:YES];
}

#pragma mark - <UIGestureRecognizerDelegate>
/**
 *  手勢識別器對象會調用這個代理方法來決定手勢是否有效
 *
 *  @return YES : 手勢有效, NO : 手勢無效
 */
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
//    if (self.childViewControllers.count == 1) { // 導航控制器中只有1個子控制器
//        return NO;
//    }
//    return YES;
    
    // 手勢何時有效 : 當導航控制器的子控制器個數 > 1就有效
    return self.childViewControllers.count > 1;
}
@end

XMGTabBarController 設置: 



#import "XMGTabBarController.h"
#import "OneController.h"
#import "TwoController.h"
#import "ThreeController.h"
#import "FourController.h"
#import "ModelController.h"
#import "XMGTabBar.h"
#import "XMGNavigationController.h"


@interface XMGTabBarController ()

@end

@implementation XMGTabBarController

- (void)viewDidLoad {
    [super viewDidLoad];
    
   // 第一個子控制器
      OneController *oneVC= [[OneController alloc]init];
      UINavigationController* oneVCN= [[UINavigationController alloc] initWithRootViewController:oneVC];
      oneVCN.tabBarItem.title=@"A控制器";
      
      //1. 分別設置
      UIImage* image1= [UIImage imageNamed:@"navigationbar_friendsearch"];
      UIImage* selelctImage1= [UIImage imageNamed:@"navigationbar_friendsearch_highlighted"];
      // 系統會被默認圖片渲染綠色,這裏改變系統渲染圖片的模式
      selelctImage1= [selelctImage1
                      imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
      oneVCN.tabBarItem.image = image1;
      oneVCN.tabBarItem.selectedImage = selelctImage1;

      // tabbarItem 設置文字 屬性
      // 屬性到  using the keys found in NSAttributedString.h 中找  UIKit下
      //
      [oneVCN.tabBarItem setBadgeValue:@"100"];
      NSMutableDictionary* normalAttrs= [NSMutableDictionary dictionary];
      normalAttrs[NSFontAttributeName]= [UIFont systemFontOfSize:14];
      normalAttrs[NSForegroundColorAttributeName]=[UIColor blackColor];
  //    [oneVC.tabBarItem setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
      
      
      NSMutableDictionary* selectAttrs= [NSMutableDictionary dictionary];
         selectAttrs[NSForegroundColorAttributeName]=[UIColor redColor];
         selectAttrs[NSFontAttributeName]= [UIFont systemFontOfSize:14];
  //    [oneVC.tabBarItem setTitleTextAttributes:selectAttrs forState:UIControlStateSelected];
      
      //2. 統一設置
      //setTitleTextAttributes:(nullable NSDictionary<NSAttributedStringKey,id> *)attributes forState:(UIControlState)state API_AVAILABLE(ios(5.0)) UI_APPEARANCE_SELECTOR;
      // 後面 有 UI_APPEARANCE_SELECTOR 可以通過 appear設置
      // 取出appear,統一設置,那麼這個app中所有的 UITabBarItem 都有這個屬性
      UITabBarItem* item= [UITabBarItem appearance];
      [item setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
      [item setTitleTextAttributes:selectAttrs forState:UIControlStateSelected];
     // [self addChildViewController:oneVC];
     [self addChildViewController:oneVCN];
      
      
      // 第二個子控制器
        TwoController *twoVC= [[TwoController alloc]init];
     UINavigationController* twoVCN= [[XMGNavigationController alloc] initWithRootViewController:twoVC];
        twoVCN.tabBarItem.title=@"B控制器";
        [self addChildViewController:twoVCN];
      
      // 中間 按鈕,如果自定義   XMGTabBar 那麼必須設置中間 控制器了
//      UIViewController* center =[[ UIViewController alloc] init];
//      [self addChildViewController: center];
    
      ThreeController *threeVC= [[ThreeController alloc]init];
       UINavigationController* threeVCN= [[XMGNavigationController alloc] initWithRootViewController:threeVC];
      threeVCN.tabBarItem.title=@"C控制器";
      [self addChildViewController:threeVCN];
      
    
      FourController *fourVC= [[FourController alloc]init];
      UINavigationController* fourVCN= [[XMGNavigationController alloc] initWithRootViewController:fourVC];
      fourVCN.tabBarItem.title=@"D控制器";
      [self addChildViewController:fourVCN];
    
    
  //    [tabBarVc addChildViewController:oneVC];
  //    [tabBarVc addChildViewController:twoVC];
  //    [tabBarVc addChildViewController:threeVC];
      
      //使用 數組的方式 同一設置
  //     tabBarVc.viewControllers=@[oneVC,twoVC,threeVC,fourVC];
    
    
    // 設置自定義tabbar
    // tabbar 是  readonly 不能直接設置,通過kvc 設置
   //  self.tabBar= [[XMGTabBar alloc] init];
    // kvc設置
    [self setValue:[[XMGTabBar alloc] init] forKeyPath:@"tabBar"];

    
}

- (void)viewWillAppear10:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    /**** 增加一個發佈按鈕 ****/
// 這個方法會被調入多次,比如,彈出模態窗口,串口消失的時候,會調用這個方法
    // 避免添加多個button
    //解決方法: 1.dispatch_once
    // 2.  懶加載  定義一個變量 publishButton
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        /**** 增加一個發佈按鈕 ****/
        UIButton *publishButton = [UIButton buttonWithType:UIButtonTypeCustom];
        publishButton.backgroundColor = XMGRandomColor;
        [publishButton setImage:[UIImage imageNamed:@"tabBar_publish_icon"] forState:UIControlStateNormal];
        [publishButton setImage:[UIImage imageNamed:@"tabBar_publish_click_icon"] forState:UIControlStateHighlighted];
        publishButton.frame = CGRectMake(0, 0, self.tabBar.frame.size.width / 5, self.tabBar.frame.size.height);
        publishButton.center = CGPointMake(self.tabBar.frame.size.width * 0.5, self.tabBar.frame.size.height * 0.5);
        [publishButton addTarget:self action:@selector(publishClick) forControlEvents:UIControlEventTouchUpInside];
        [self.tabBar addSubview:publishButton];
    });
}


-(void)publishClick{
    NSLog(@"helll");
    
     ModelController* modelVc= [[ModelController alloc] init];
     UINavigationController* nav= [[UINavigationController alloc] initWithRootViewController:modelVc];
    
     [self presentViewController:nav animated:YES completion:^{
         
     }];

}


@end

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章