美文网首页
4.2UINavigationController详解2和视图的

4.2UINavigationController详解2和视图的

作者: 草根小强 | 来源:发表于2019-04-10 21:18 被阅读0次

    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和视图的

          本文链接:https://www.haomeiwen.com/subject/docaiqtx.html