iOS_UI_07_UINavigationController

第七章 UINavigationController

一、UINavigationController
1.UINavigationController:导航控制器,多视图控制器,管理多个视图控制器,称为管理控制器的控制器,主要管理有层次递进关系的控制器
2.UINavigationController:继承于UIViewController,以栈的方式管理所控制的视图控制器,至少要有一个被管理的视图控制器,这个控制器我们称为导航控制器的根视图控制器,任何继承自UIViewController的类(多态)都可以作为根视图控制器
    //导航控制器的使用 ,导航控制器的初始化方式一般需要带根视图控制器,导航控制器是用来管理一组有序的视图控制器的视图控制器,他只负责管理视图控制器之间的切换,不负责内容的呈现。所以起码需要管理一个视图控制器。
    //第一步:创建导航控制器的根视图控制器
    ViewController* rootVC = [[ViewController alloc] init];
    //第二步:
    UINavigationController* navigationController = [[UINavigationController alloc] initWithRootViewController:rootVC];
    //第三步:将导航控制器设置为window的根视图控制器
    self.window.rootViewController = navigationController
二、UINavigationBar
1.UINavigationBar(导航栏):两部分,一为导航栏上的各种导航部件(UINavigationItem),二为导航栏自身的相关设置
2.navigationBar:导航条,iOS 7 之后默认是半透明的,之前是不透明的
3.navigationBar竖屏下默认高度为44,横屏默认高度为32,状态栏(statusBar)高度为20---iOS 7之后,navigationBar的背景会延伸到状态栏(statusBar)上,导航栏高为仍保持44,但显示效果为64
4.每个视图控制器都有一个navigationItem属性,navigationItem中设置左按钮、右按钮、标题等,会随着控制器的显示,也显示在navigationBar上
5.navigationItem的属性
    1.设置标题
         self.title = @"标题";---tong'shi'gai'bian'dao'hang'lan'de'biao'ti'he同时改变导航栏的标题和tabBar的标题
         self.navigationItem.title = @"标题"---单独操作导航栏标题
    2.设置左按钮、右按钮---间接继承与NSobject,不是按钮控件
       self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:@selector(leftAction)] autorelease];
    3.创建UIBarButtonItem的初始化方法
       1.initWithImage:style:target:action:---参数1:图片--参数2:barButtonStyle(按钮样式,枚举类型)--参数3;目标对象--参数4:方法
       2.initWithTitle:style:target:action:---参数1:按钮文字--参数2:barButtonStyle(按钮样式,枚举类型)--参数3;目标对象--参数4:方法
       3.initWithBarButtonSystemItem:target:action:---参数1:系统按钮样式(枚举)--参数2:目标对象--参数3:方法
       4.initWithCustomView:---参数1;自定义UIView对象
    4.左右item数组---self.navigationItem.leftBarButtonItems = @[item1, item2];
    5.TitleView标题视图---titleView
       self.navigationItem.titleView = segmentC;
    6.导航栏的显隐属性---self.navigationController.navigationBarHidden = NO;
    7.导航栏样式---self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
    8.背景颜色---self.navigationController.navigationBar.backgroundColor = [UIColor redColor];
    9.导航栏颜色---self.navigationController.navigationBar.barTintColor = [UIColor yellowColor];
    10.导航栏元素颜色---self.navigationController.navigationBar.tintColor = [UIColor blackColor];
    11.导航栏的半透明效果---默认开启YES
       半透明效果开启时,屏幕左上角为坐标原点
       半透明关闭时,导航栏左下角为坐标原点
       self.navigationController.navigation Bar.translucent = YES;
三、页面跳转
1.工作原理:UINavigationController通过栈的方式管理控制器的切换,控制入栈(push)和出栈(pop)来展示各个视图控制器,
2.UINavigationController的ContentView里始终显示栈顶控制器的View。
3.viewControllers属性是一个可变数组(NSMutableArray)存储了栈中的所有被管理的控制器,入栈的时候,使用addObject把新的视图控制器对象添加到数组末尾,出栈时removeLastObject移除数组末尾的视图控制器对象。
4.navigationController属性,父类中的属性,每个在栈中的控制器,都能通过此属性,获取自己所在的UINavigationController对象
5.栈的特点:xian'ji先进后出,后进先出。栈顶为当前显示的视图控制器
6.常用属性
      1.viewControllers:所有处于栈中的控制器,使用数组保存
      2.topViewController:位于栈顶的控制器
      3.visibleViewController:当前显示的控制器等同于topViewController模态控制器的原理
      4.navigationBar;导航栏
      5.navigationItem:导航栏控件
7.入栈和出栈的方法
      1.pushViewController:animated:---进入下一个视图控制器
      2.popViewControllerAnimated:---返回上一个视图控制器
      3.popToViewController:animated:---返回指定的视图控制器
      4.popToRootViewControllerAnimated:---返回根视图控制器
四、模态(modal)
1.进入下一页步骤
      1.创建下一页对象
      2.设置过渡动画(有默认值,可以不设置) ---modalTransitionStyle(枚举类型)
        secVC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
      3.模态控制器---参数1:下一页对象--参数2:是否使用动画--参数:模态完成后执行的block(匿名函数;可以在方法内部作为属性使用,标志为倒三角)
         [self presentViewController:secVC animated:YES completion:^{
         
         }];
2.返回上一页
     参数1:是否动画---参数2:返回完成后执行的block
     [self dismissViewControllerAnimated:YES completion:^{
     
     }];
3.页面切换方式对比
     1.主要分为:推出(push)和模态(present)
     2.推出(push0用于一系列的视图之间的跳转,有层次递进关系
     3.模态(present)用于单独功能页面的跳转和主要业务逻辑没有关联(登录,歌曲播放页,系统相册,应用中调用系统功能)

扩展
1.MVC的应用场景:为导航栏添加按钮---MVC 的应用场景 C:navigationController  V:Bar   M:item
2.让图片保持原有,不被系统的颜色所渲染,我们就需要设置图片的渲染模式
    UIImage* image = [[UIImage imageNamed:@"11.png"] imageWithRenderingMode:(UIImageRenderingModeAlwaysOriginal)];
3.视图出现的生命周期
    1.加载视图---loadView
    2.加载完毕---viewDidLoad 
    3.视图即将出现
        - (void)viewWillAppear:(BOOL)animated{
            [super viewWillAppear:animated];
             NSLog(@"%s",__FUNCTION__);
        }
    4.视图已经出现
        - (void)viewDidAppear:(BOOL)animated{
            [super viewDidAppear:animated];
              NSLog(@"%s",__FUNCTION__);
        }
    5.视图即将消失
        - (void)viewWillDisappear:(BOOL)animated{
            [super viewWillDisappear:animated];
              NSLog(@"%s",__FUNCTION__);
        }
    6.视图已经消失
        - (void)viewDidDisappear:(BOOL)animated{
            [super viewDidDisappear:animated];
              NSLog(@"%s",__FUNCTION__);
        }
4.MRC和ARC下都可以使用dealloc方法,区别为:MRC:必须在方法的最后加[super dealloc];ARC:不能添加[super dealloc]     

contentInsert:四个参数:上左下右
1.contentSize是UIScrollView可以滚动的区域。在我的理解中,我把UIScrollView看成是具有上下两层的一个复合视图,frame控制着上层的大小,我们看到的UIScrollView的大小实际就是frame的大小,上层固定不动,显示的变化,由下层的滚动来控制。而下层滚动的区域的大小,就是由contentSize来控制的了。例如:若frame = (0, 0, 320, 480) contentSize = (320, 960),代表本UIScrollView可以上下滚动,滚动区域为frame大小的两倍。
2.contentOffset是UIScrollView当前显示区域的顶点相对于frame顶点的偏移量,例如上面的例子如果拉到最下面,则contentOffset就是(0, 480),也就是y偏移了480.
3.contentInset的API文档的解释是"内容视图嵌入到封闭的滚动视图的距离"(哈,英文不是很好,翻译的不好)。可以理解为内容视图的上下左右四个边扩展出去的大小。contentInset的单位是UIEdgeInsets,默认值为UIEdgeInsetsZero,也就是没有扩展的边。下面解释一下UIEdgeInsets,它是一个结构体,定义如下:
    typedef struct {  
     CGFloat top, left, bottom, right;  
 }  

scrollsToTop:点击状态栏,返回顶部,默认为YES,不需要设置
SCrollView的tracking属性
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容