4.2UINavigationController详解2和视图的模态跳转

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

你可能感兴趣的:(4.2UINavigationController详解2和视图的模态跳转)