UINavigationController详解2
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//实例化
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
//
[self aboutNavigationController];
return YES;
}
- (void) aboutNavigationController{
//视图控制器分为两类:
//1.普通的视图控制器,相当于一张画布,可以提供给我们UI操作的空间。能看得到,摸得着。
//2.容器视图控制器。
//导航视图控制器:也是一个视图控制器,是用来管理其他的视图控制器的。
//导航视图控制器:也是一个视图控制器,是一个容器视图控制器,用来管理一系列层次明显的视图之间的切换。
//导航视图控制器的实例化,我们只能用这种方式来实现。
//在实例化一个导航视图控制器的时候,需要同时实例化一恶搞第一个要显示的界面
ViewController *vc = [[ViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
//给Window 设置一个根视图控制器
self.window.rootViewController = nav;
//在屏幕的最上方,那个条叫做 --导航栏( UINavigationbar)
//状态栏:高度为20(高度是固定的) 显示wifi 时间 电池那一栏,在导航栏上方
//导航栏: 高度是44
//ios 7 之前,导航栏 和 状态栏 是分开的(它的坐标(0,0)点 再导航栏左上角)ios7 之后, 由于导航栏和状态栏都透明了,两者看似成了整体
//有关导航栏的常用属性
//1.怎么获取一个导航栏?
//导航栏是导航视图控制器特有的,不需要我们去做一个实例化。
//被同一个导航视图控制器管理的所有的视图�控制器,共用一个导航栏的
UINavigationBar *bar = nav.navigationBar;
//2. 样式
/*
UIBarStyleDefault 默认 白色 毛玻璃
UIBarStyleBlack 黑色 毛玻璃 //微信就是用这款
//状态栏式
*/
bar.barStyle = UIBarStyleBlack;
//3. 是否透明(并不是严格意义上的透明,而是指的是能够模糊的看到后面的内容,这个时候,坐标原点再左上角)
//这个属性的使用,需要注意一个问题:
//是否透明会影响到坐标原点的位置。
bar.translucent = YES;
//修改背景颜色不会影响到状态栏的字体颜色
//但是修改导航栏的样式是回影响状态栏的字体颜色的
// UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
// label.backgroundColor = [UIColor whiteColor];
//4. 设置背景颜色
bar.barTintColor = [UIColor whiteColor];
//5.设置导航栏的背景图片
//再ios 7之前 给导航栏设置背景图片只能设置44高度的。
//在ios 7 之后, 给导航栏设置背景图片设置44 高度或者 64 高度的
/**UIBarMetricsDefault,//竖屏 正常状态
UIBarMetricsCompact, //横屏 正常状态
UIBarMetricsDefaultPrompt = 101, //竖屏 带详情状态
UIBarMetricsCompactPrompt,//横屏 带详情状态
**/
//思考 再44图片下 坐标原点在哪里 原点根据透明度是否判断即可
[bar setBackgroundImage:[UIImage imageNamed:@"header_bg64"] forBarMetrics:UIBarMetricsDefault];
//6. 镂空颜色(表示的是导航栏上字体颜色 标题除外)
bar.tintColor = [UIColor redColor];
}
#import "ViewController.h"
#import "SecondViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = [UIColor orangeColor];
//设置标题 (这个属性属于UIView的 继承关系)
self.title = @"哈哈哈";
[self aboutNavigationItem];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//获取SecondViewComtronller的对象
SecondViewController *second = [[SecondViewController alloc] init];
//这个方法是固定的
//执行这个切换的操作的主题肯定是 导航视图控制器
//? 怎么再这个控制器拿到当前管理它的导航视图控制器?
[self.navigationController pushViewController:second animated:YES];
//视图控制器默认背景是
//导航视图控制器的一个push操作,就相当于一个压栈的操作
//先进后出 后进先出
}
- (void)aboutNavigationItem{
//导航栏是共有的。但是每个界面的导航元素是私有的。
//所谓导航元素,其实就是导航栏上显示的内容
//1.详情
//在导航栏上多出来一行,用来显示额外的信息。导航栏高度额外增加 30
self.navigationItem.prompt = @"相亲";
// 2.标题
self.navigationItem.title = @"其实,我才是标题";
//3.标题视图,也就是自定义标题titleView 属于UIView的属性
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 300)];
// label.backgroundColor = [UIColor whiteColor];
label.textColor = [UIColor redColor];
label.text = @"毫不客气的说,我才是标题";
//titleView会和导航栏默认的做一个对齐的操作 居中
self.navigationItem.titleView = label;
//4.关于导航元素的左视图和右视图
/*
UIBarButtonSystemItemDone,
UIBarButtonSystemItemCancel,
UIBarButtonSystemItemEdit,
UIBarButtonSystemItemSave,
UIBarButtonSystemItemAdd,
UIBarButtonSystemItemFlexibleSpace,
UIBarButtonSystemItemFixedSpace,
UIBarButtonSystemItemCompose,
UIBarButtonSystemItemReply,
UIBarButtonSystemItemAction,
UIBarButtonSystemItemOrganize,
UIBarButtonSystemItemBookmarks,
UIBarButtonSystemItemSearch,
*/
//系统样式
UIBarButtonItem *left0 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(show:)];
/*
UIBarButtonItemStylePlain,
UIBarButtonItemStyleBordered*/
//done 样式比plain样式稍微粗了一点
UIBarButtonItem *left1 = [[UIBarButtonItem alloc] initWithTitle:@"标题" style:UIBarButtonItemStylePlain target:self action:@selector(show:)];
//在ios 7 以后,苹果对导航栏元素做了一些特殊的处理,为了适应一个扁平化的效果
//如果想展示图片原来的内容,需要对图片进行一个原色的处理
//
UIImage *image = [UIImage imageNamed:@"itemImage"];
//UIImageRenderingModeAlwaysOriginal永远保持原色
//这个方法只时候ios7之后的
#warning 获取设备系统版本号
if ([UIDevice currentDevice].systemVersion.floatValue >= 7){
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}
UIBarButtonItem *left2 = [[UIBarButtonItem alloc] initWithImage: image style:UIBarButtonItemStylePlain target:self action:@selector(show:)];
//自定义样式
//自定义视图,宽和高是有意义的。
UIBarButtonItem *left3 = [[UIBarButtonItem alloc] initWithCustomView:label];
self.navigationItem.leftBarButtonItem = left3;
self.navigationItem.leftBarButtonItems = @[left0, left1, left2];
//导航元素的左视图 可以设置为同一个
// self.navigationItem.leftBarButtonItem = left0;
// self.navigationItem.rightBarButtonItem = left0;
//toolbar ?:返回怎么又没了
// self.navigationItem.leftBarButtonItem = [];
}
//如果加一个参数 必须是UIBarButtonItem
- (void)show:(UIBarButtonItem *)item{
NSLog(@"我点了");
}
@end
#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//出栈 有三种方式
//1. 出一层
// [self.navigationController popViewControllerAnimated:YES];
//2. 返回到根视图控制器
// [self.navigationController popToRootViewControllerAnimated:YES];
// 3.返回到指定的指定的视图控制器
// A -》 B -》C —》 D —》E ?:E —》B ,E —》C
//实现思路:分两步。
// 3.1 找到要返回的视图控制器
//需要通过导航视图控制器来拿到
//.viewControllers 表示这个导航视图控制器管理的所有的儿子视图控制器,数组的顺序是从根视图控制器(0)开始,依次递增。
UIViewController *vc = self.navigationController.viewControllers[0];
//3.2 返回
[self.navigationController popToViewController:vc animated:YES];
}
@end
视图的模态跳转
#import "AppDelegate.h"
#import "ViewController.h"
#import "LQViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1.实例化一个窗口对象
// self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//2.把这个窗口作为屏幕主窗口,并显示。
// [self.window makeKeyAndVisible];
//屏幕/窗口就相当于一个画板
//UIViewController相当于一个画布
//我们的UI操作,以后要在画布上操作
//程序的启动的时候,需要给一个画板上默认的贴上一张画布,方便我们做操作
//我们需要给UIWindow设置一个默认显示的UIViewController
//设置window 的根视图控制器
//(我们暂且把ViewController这个类的对象作为窗口的根视图控制器)
ViewController *vc = [[ViewController alloc] init];
// LQViewController *vc = [[LQViewController alloc] init];
self.window.rootViewController = vc;
//singleView 已经帮我们上面的代码写好了
return YES;
}
#import "ViewController.h"
#import "LQViewController.h"
@interface ViewController ()
@end
@implementation ViewController
//视图(self.view)加载完成
//视图控制器本身提供一个.view的属性。给我们提供一个视图,用来做视图操作
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
NSLog(@"viewDidLoad");
}
//生命周期
//1.loadView 加载视图
- (void)loadView{
//我们一般不会去重写这个lowView这个方法,如果真的需要重写,一定要加上[super loadView];
[super loadView];
NSLog(@"loadView");
}
//2.viewDidLoad 视图加载完成(一般情况下,只会执行一次)
//3.viewWillAppear 视图即将显示 //显示和已经显示这两个方法是有时间差的
- (void)viewWillAppear:(BOOL)animated{
NSLog(@"视图即将完成");
}
//4.viewDidAppear 视图已经显示
- (void)viewDidAppear:(BOOL)animated{
NSLog(@"视图已经显示");
}
// 5.viewWillDisappear视图即将消失 //只要有对象引用它时,不会销毁 ,没有对象引用时,对象销毁
- (void)viewWillDisappear:(BOOL)animated{
NSLog(@"视图即将消失");
}
//6. viewDidDisappear视图已经消失
- (void)viewDidDisappear:(BOOL)animated{
NSLog(@"视图已经消失");
}
// 7.对象销毁
- (void)dealloc{
NSLog(@"销毁");
}
//点击背景的时候触发
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
// 视图的模态跳转 //比如从界面从下往上跳转就是模态
// 一般情况下,是为了弹出来一个临时性的界面,操作完成后,这个界面需要在回去。
// 其中,被弹出来得视图称之为---模态视图。(Modal)
// 需求:当点击背景的时候,弹出来一个LQviewController这个界面
LQViewController *lf = [[LQViewController alloc] init];
//
// 1.参数一: 要弹出的视图控制器的对象
// 2.参数二: 是否需要动画弹出
// 3.弹出完成后的回调
[self presentViewController:lf animated:NO completion:^{
NSLog(@"弹出完成");
}];
}
@end
#import "LQViewController.h"
#import "ViewController.h"
@interface LQViewController ()
@end
@implementation LQViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor yellowColor];
}
//3.viewWillAppear 视图即将显示 //显示和已经显示这两个方法是有时间差的
- (void)viewWillAppear:(BOOL)animated{
NSLog(@"视图即将完成");
}
//4.viewDidAppear 视图已经显示
- (void)viewDidAppear:(BOOL)animated{
NSLog(@"视图已经显示");
}
// 5.viewWillDisappear视图即将消失 //只要有对象引用它时,不会销毁 ,没有对象引用时,对象销毁
- (void)viewWillDisappear:(BOOL)animated{
NSLog(@"视图即将消失");
}
//6. viewDidDisappear视图已经消失
- (void)viewDidDisappear:(BOOL)animated{
NSLog(@"视图已经消失");
}
//点击背景的回调
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//需求: 弹回
//是否需要动画
//完成回去之后的回调
// [self dismissViewControllerAnimated:NO completion:nil];
#warning 注意!!!!
//
// ViewController * vc = [[ViewController alloc] init];
// [self presentViewController:vc animated:YES completion:nil];
//
}
- (void)dealloc{
NSLog(@"销毁");
}
@end