导航

 

 

【UINavigationController】

导航控制器

 

步骤

1,初始化

2,push 进入新视图

3,pop 返回

 

 

返回到指定视图

//通过导航控制器找到所有的界面

NSArray *controllers =self.navigationController.viewControllers;

//返回到固定界面 (前提是要返回到的视图控制器对象存在)

[self.navigationController popToViewController:[controllers objectAtIndex:1] animated:YES];

 

 

【self.navigationController.navigationBar】

//[UINavigationBar appearance]这种方式也能找到navigationBar导航条。

【导航条的设置是针对整个导航的,会影响当前导航中的所有页面】

 

//导航条的隐藏状态

//self.navigationController.navigationBarHidden = YES;

@property(nonatomic,getter=isNavigationBarHidden) BOOL navigationBarHidden;

- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated;

 

//导航条的背景色

@property(nonatomic,retain) UIColor *barTintColor;

//内容渲染颜色

@property(nonatomic,retain) UIColor *tintColor;

//是否半透明(这个设置对起始坐标点{0,0}的影响权限最高)

@property(nonatomic,assign,getter=isTranslucent) BOOL translucent;

//背景图

- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics;

 

 

 

【UIBarButtonItem】

//导航条专用按钮

 

//四种创建方式

- (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;

- (id)initWithImage:(UIImage *)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;

- (id)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action;

- (id)initWithCustomView:(UIView *)customView;

 

//UIBarButtonSystemItemFlexibleSpace,是自带的一种空的item,可以当作占位符用

 

 

【self.navigationItem】

//给导航条设置专用按钮和titleView

 

//title

@property(nonatomic,copy) NSString *title;

//中间的view

@property(nonatomic,retain) UIView *titleView;

 

//隐藏自带的返回按钮

@property(nonatomic,assign) BOOL hidesBackButton;

- (void)setHidesBackButton:(BOOL)hidesBackButton animated:(BOOL)animated;

 

//左边和右边的专用按钮

@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;

@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;

- (void)setLeftBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated;

- (void)setRightBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated;

 

 

//左边和右边的专用按钮组(数组中存放的是UIBarButtonItem)

@property(nonatomic,copy) NSArray *leftBarButtonItems;

@property(nonatomic,copy) NSArray *rightBarButtonItems;

- (void)setLeftBarButtonItems:(NSArray *)items animated:(BOOL)animated; 

- (void)setRightBarButtonItems:(NSArray *)items animated:(BOOL)animated;

 

 

【self.navigationController.toolbar】工具条

 

//每个导航控制器都自带有一个工具栏,是一个UIToolBar的对象,显示在最底部,尺寸(320*44),工具栏默认处于隐藏状态

//注意:自带的这个工具条一般情况下都不用。如果要用的话我们会自己创建一个新的UIToolBar

 

//工具条隐藏状态

//self.navigationController.toolbarHidden = NO;

@property(nonatomic,getter=isToolbarHidden) BOOL toolbarHidden;

- (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated;

 

//背景色

@property(nonatomic,retain) UIColor *barTintColor;

//内容渲染颜色

@property(nonatomic,retain) UIColor *tintColor;

//是否半透明

@property(nonatomic,assign,getter=isTranslucent) BOOL translucent;

【上面的属性和navigationBar的使用方式一样】

 

//设置背景图片

- (void)setBackgroundImage:(UIImage *)backgroundImage forToolbarPosition:(UIBarPosition)topOrBottom barMetrics:(UIBarMetrics)barMetrics;

//UIBarPosition中的枚举值只支持iOS7

//UIToolbarPositionBottom(在iOS7和7以前的操作系统都适用)

//UIToolbarPositionBottom 理解(每个UIView都可以指定TopBar 和BottomBar),导航控制器中工具栏是作为导航控制器view的BottomBar被自动创建出来的

 

给toolBar设置专用button(数组中也是UIBarButtonItem)

//让viewController直接设置

//self.toolbarItems = array;

@property (nonatomic, retain) NSArray *toolbarItems;

- (void)setToolbarItems:(NSArray *)toolbarItems animated:(BOOL)animated;

 

#import "AppDelegate.h"

#import "FirstViewController.h"

 

@implementation AppDelegate

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.

    

    //创建一个页面

    FirstViewController *fvc = [[FirstViewController alloc] init];

    

    //使用一个页面创建一个导航控制器

    UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:fvc];

    

    //将导航控制器和window关联

    self.window.rootViewController = nc;

    

    self.window.backgroundColor = [UIColor whiteColor];

    [self.window makeKeyAndVisible];

    return YES;

}

 

#import "FirstViewController.h"

#import "SecondViewController.h"

 

@interface FirstViewController ()

 

@end

 

@implementation FirstViewController

 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        // Custom initialization

    }

    return self;

}

 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    SecondViewController *svc = [[SecondViewController alloc] init];

    

    //通过页面找到nc,让nc推出一个新的页面

    [self.navigationController pushViewController:svc animated:YES];

}

 

- (void)viewDidLoad

{

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    self.view.backgroundColor = [UIColor redColor];

    

    [self setNavigationBar];

}

 

- (void)setNavigationBar

{

    //设置导航条的隐藏状态(导航条是属于导航控制器的)

    self.navigationController.navigationBarHidden = NO;

    

    //通过页面找到nc,通过nc找到导航条

    //对导航条的设置是针对整个nc的

    //self.navigationController.navigationBar

    

    //设置背景色

    self.navigationController.navigationBar.barTintColor = [UIColor brownColor];

    

    //设置导航条内容(比如说自带的返回按钮)的渲染色

    self.navigationController.navigationBar.tintColor = [UIColor purpleColor];

    

    //设置半透明状态,如果写成NO,那么坐标{0,0}的位置是导航条的左下角

    //如果写成YES,坐标{0,0}的位置在左上角

    //在iOS7以前状态栏的高度是20,导航条高度是44,分开计算的

    //从iOS7开始,合并计算高度为64

    self.navigationController.navigationBar.translucent = NO;

    

    //设置背景图片,如果图片的大小是320*44(640*88)就会显示成iOS7之前风格

    //如果图片的大小不是320*44(640*88),就会用新风格并且平铺

    //在主流的设计中,图片的大小需要和导航条匹配(320*64)

    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"aa"] forBarMetrics:UIBarMetricsDefault];

    

    //设置整个导航中,导航条上title的文字属性,属性是通过字典来设置的

    //字典里放的就是文字属性的键值对

    self.navigationController.navigationBar.titleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont systemFontOfSize:10], NSFontAttributeName, [UIColor greenColor], NSForegroundColorAttributeName, nil];

}

 

#import "SecondViewController.h"

#import "ThirdViewController.h"

 

@interface SecondViewController ()

 

@end

 

@implementation SecondViewController

 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        // Custom initialization

    }

    return self;

}

 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    ThirdViewController *tvc = [[ThirdViewController alloc] init];

    

    [self.navigationController pushViewController:tvc animated:YES];

}

 

- (void)viewDidLoad

{

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    self.view.backgroundColor = [UIColor orangeColor];

    

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];

    btn.frame = CGRectMake(60, 70, 100, 40);

    btn.backgroundColor = [UIColor grayColor];

    [btn setTitle:@"返回" forState:UIControlStateNormal];

    [btn addTarget:self action:@selector(backClick) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn];

    

    [self setNavigationItem];

}

 

- (void)setNavigationItem

{

    //设置显示在导航条上的title,针对于当前页面的

    //下一个页面自带的返回按钮上的文字就是当前页的title

    self.navigationItem.title = @"oyeah~";

    

    //设置当前页面显示在导航条上的元素

    //self.navigationItem

    

    UILabel *tView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 60, 30)];

    tView.backgroundColor = [UIColor magentaColor];

    tView.text = @"gogo";

    tView.textAlignment = NSTextAlignmentCenter;

    

    //设置当前页面在导航条中间显示的view

    self.navigationItem.titleView = tView;

    

    //隐藏自带的返回按钮

    self.navigationItem.hidesBackButton = YES;

    

    /**********下面是专用按钮的四种创建方法*************/

    

    //1,使用文字创建一个专用按钮

    UIBarButtonItem *abbi = [[UIBarButtonItem alloc] initWithTitle:@"ab" style:UIBarButtonItemStyleDone target:self action:@selector(click)];

    

    //设置当前页面中显示在导航条左边的专用按钮

    self.navigationItem.leftBarButtonItem = abbi;

    

    //设置专用按钮上的文字属性(这个设置只对abbi生效)

    [abbi setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont systemFontOfSize:30], NSFontAttributeName, [UIColor blackColor], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal];

    

    //2,使用图片创建专用按钮(只取图片的形状,不取颜色)

    UIBarButtonItem *bbbi = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"logo_title"] style:UIBarButtonItemStyleDone target:self action:@selector(click)];

    

    //设置当前页面中显示在导航条右边的专用按钮

//    self.navigationItem.rightBarButtonItem = bbbi;

    

    //3,使用系统自带的图标创建专用按钮

    UIBarButtonItem *cbbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(click)];

//    self.navigationItem.rightBarButtonItem = cbbi;

    

    //有一个btn

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];

    [btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];

    

    //4,使用自定义的view来创建专用按钮(一般都是用btn)

    UIBarButtonItem *dbbi = [[UIBarButtonItem alloc] initWithCustomView:btn];

//    self.navigationItem.rightBarButtonItem = dbbi;

    

    //设置右边的一组专用按钮

    self.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects:bbbi, cbbi, dbbi, nil];

    

    

}

 

- (void)click

{

    NSLog(@"%s",__func__);

}

 

- (void)backClick

{

    //通过页面找到nc,让nc返回到上一面(效果和原理都跟nc自带的返回按钮一样)

    [self.navigationController popViewControllerAnimated:YES];

}

 

#import "ThirdViewController.h"

#import "ForthViewController.h"

 

@interface ThirdViewController ()

 

@end

 

@implementation ThirdViewController

 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        // Custom initialization

    }

    return self;

}

 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    ForthViewController *fvc = [[ForthViewController alloc] init];

    

    [self.navigationController pushViewController:fvc animated:YES];

}

 

- (void)viewDidLoad

{

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    self.view.backgroundColor = [UIColor yellowColor];

 

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];

    btn.frame = CGRectMake(60, 70, 100, 40);

    btn.backgroundColor = [UIColor grayColor];

    [btn setTitle:@"返回" forState:UIControlStateNormal];

    [btn addTarget:self action:@selector(backClick) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn];

}

 

- (void)backClick

{

    //返回到根(沿途所有页面全部销毁)

    [self.navigationController popToRootViewControllerAnimated:YES];

}

 

- (void)viewWillAppear:(BOOL)animated

{

    NSLog(@"%s",__func__);

}

 

- (void)viewDidAppear:(BOOL)animated

{

    NSLog(@"%s",__func__);

}

 

- (void)viewWillDisappear:(BOOL)animated

{

    NSLog(@"%s",__func__);

}

 

- (void)viewDidDisappear:(BOOL)animated

{

    NSLog(@"%s",__func__);

}

#import "ForthViewController.h"

 

@interface ForthViewController ()

 

@end

 

@implementation ForthViewController

 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        // Custom initialization

        NSLog(@"%s",__func__);

    }

    return self;

}

 

- (void)viewWillAppear:(BOOL)animated

{

    NSLog(@"%s",__func__);

}

 

- (void)viewDidAppear:(BOOL)animated

{

    NSLog(@"%s",__func__);

}

 

- (void)viewWillDisappear:(BOOL)animated

{

    NSLog(@"%s",__func__);

}

 

- (void)viewDidDisappear:(BOOL)animated

{

    NSLog(@"%s",__func__);

}

 

- (void)dealloc

{

    NSLog(@"%s",__func__);

}

 

- (void)viewDidLoad

{

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    NSLog(@"%s",__func__);

    

    self.view.backgroundColor = [UIColor greenColor];

    

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];

    btn.frame = CGRectMake(60, 70, 100, 40);

    btn.backgroundColor = [UIColor grayColor];

    [btn setTitle:@"返回" forState:UIControlStateNormal];

    [btn addTarget:self action:@selector(backClick) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn];

}

 

- (void)backClick

{

    //找到当前导航控制器里所有的页面

    NSArray *viewControllerArr = self.navigationController.viewControllers;

    

    //找到固定的页面,用父类指针指向

    UIViewController *orVC = [viewControllerArr objectAtIndex:1];

    

    //让nc回到固定页面(必须是在nc中已经存在的,同时沿途所有页面销毁)

    [self.navigationController popToViewController:orVC animated:YES];

}

 

让明天,不后悔今天的所作所为
原文地址:https://www.cnblogs.com/-yun/p/4354546.html