您的位置:首页 > 产品设计 > UI/UE

iOS开发基础 - UINavigationcontroller

2016-03-25 10:50 465 查看
1.UINavigationcontroller(导航控制器)

【注】导航控制器,是UIKit框架提供的一个容器视图控制器,用于切换拥有明确层次关系的视图。即由一级视图切换到二级视图,而不是平级视图间的切换。

【注】导航中视图控制器的层次结构,称为栈结构。

//导航控制器在初始化的时候,需要接收一个视图控制器的对象,这个视图控制器叫做导航控制器的根视图控制器

//根视图控制器(它的view会在程序启动之初,加到导航控制器上)

//initWithRootViewController 会使root引用计数+1

//导航控制器能够通过特定的方式来管理视图控制器

【注】1.iOS7中视图控制器的view是满屏显示的,状态栏(20)和导航条(44)会遮住视图控制器view的一部分

2.向view上添加控件,y至少要从64开始

3.iOS7以前(视图控制器view的y坐标从导航条的下面开始算起)

//导航控制器通过栈这种数据结构来管理视图控制器(导航控制器有一个栈容器)

//栈是一种常用的数据结构 (栈中元素遵循先进后出的原则)

/*1、第一个被添加到栈中的元素叫做基栈

*2、最后一个被添加到栈中的元素叫做栈顶

*3、将元素添加到栈中的操作叫做元素的入栈

*4、移除栈中元素的操作,叫做元素的出栈

*/

//导航控制器操作视图控制器对象的入栈和出栈

FirstViewController *firstVC = [[FirstViewController alloc]init];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:firstVC];
self.window.rootViewController =  nav;
[self.window makeKeyAndVisible];


1.将当前页退出栈

[self.navigationController popViewControllerAnimated:YES];

2.将新页面加入栈

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

3.退出到首页(栈底)

[self.navigationController popToRootViewControllerAnimated:YES];

4.到达指定页面(栈的位置)

//拿到导航控制器里面所有的viewController

NSArray * vcArr = self.navigationController.viewControllers;

[self.navigationController popToViewController:vcArr[1] animated:YES];

2.UINavigationBar(导航条)

//UINavigationBar (导航条,普通视图控件,父类为UIView)

//每个导航控制器有且只有一个导航条(所有的视图控制器共用一个导航条)

//导航控制器中的导航条尺寸固定(320*44)

//拿到导航条的方法:self.navigationController.navigationBar

//设置导航条的风格(黑色风格,默认为Defautl风格,iOS7以后,余下的三个样式几乎没有差别),设置导航条的风格样式会波及到状态栏

//iOS7以前,设置导航条的样式不会影响状态栏

【注】//开发中应用做多的(设置导航条的背景图片)

//UIBarMetricsDefault 对应iPhone竖屏(人像模式)

//UIBarMetricsLandscapePhone 对应iPhone横屏(风景模式)

【注】iOS7中push到导航控制器的视图控制器,如果view为默认的clearColor,在push的时候,会出现卡顿的现象,iOS7以前不会

解决办法,改变被push的试图控制器view的背景颜色

1.设置背景颜色
//导航控制器的导航条 在ios7之后有半透明的效果
//【注】导航条 是属于导航控制器的  一个导航控制器一个导航条
//setBarTintColor设置导航条的颜色
[self.navigationController.navigationBar setBarTintColor:[UIColor cyanColor]];

2.设置背景图片
UIImage *image = [UIImage imageNamed:@"navigationbar"];
//把图片拉伸
image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(2, 2, 2, 2) resizingMode:UIImageResizingModeStretch];

//屏幕向下20的高度是状态栏  导航条的高度64  当图片是44高度时会显示出状态栏 大于44会覆盖状态栏
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav-32"] forBarMetrics:UIBarMetricsCompact];
/*
UIBarMetricsDefault,//人像模式 竖屏
UIBarMetricsCompact,//风景模式 横屏
*/

3.隐藏导航条
//self.navigationController.navigationBarHidden = YES;
4.设置样式
self.navigationController.navigationBar.barStyle = UIBarStyleBlack


3.NavigationItem

【注】UINavigationItem(用于定制导航条上内容的显示) 属于每个导航中的视图控制器,每个视图控制器有自己的BarItem,每个页面单独定制自己的Item

//每个视图控制器可以通过navigationItem属性,来定制导航条上的显示 self.navigationItem

//通过navigationItem设置导航条上显示的标题

//设置导航条上的按钮(UIBarButtonItem的对象有多种创建方式)

//通过初始化标题的方法

//UIBarButtonItemStylePlain (iOS7中将Item的圆角矩形和边框全部去掉了)

【注】开发中最常用的创建UIBarButtonItem的方法 initWithCustomView(接收UIView)最常用的接收一个UIButton(custom样式,贴图)

1.两种设置标题的方法
self.title = @"第二页";
self.navigationItem.title = @"第二页";
2.自定义标题
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 20, 40, 40)];
label.text = @"第二页";
label.backgroundColor = [UIColor orangeColor];
self.navigationItem.titleView = label;

//导航项
UINavigationItem * item = [[UINavigationItem alloc]initWithTitle:@"下一页"];

3.自定义更改两边的按钮(图标样式为系统自带枚举)
//UINavigationItem UIBarItem  UIBarButtonItem都不是UIView的子类 但是都可以显示
UIBarButtonItem *letfItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:@selector(pushVC)];
self.navigationItem.rightBarButtonItem = letfItem;
//rightBarButtonItem 右侧导航项
//leftBarButtonItem 左侧导航项

4. //自定义UIBarButtonItem
UIBarButtonItem *letfItem = [[UIBarButtonItem alloc]initWithCustomView:btn];
//UIBarButtonSystemItemFixedSpace 这个样式不显示 可以来调节UIBarButtonItem间的距离
UIBarButtonItem *item3 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
//UIDevice设备类 单例类
//UIDevice currentDevice拿到当前设备  systemVersion版本号
if ([UIDevice currentDevice].systemVersion.floatValue >= 7.0) {
item.width = -7.0;//设置调节距离item的宽度
}

self.navigationItem.leftBarButtonItems = @[item3,letfItem];


4.UIAppearance

【注】appearance是iOS5新增的方法,是用于对没有创建控件进行一次统一的设置,无法对已经创建控件进行设置

//需要注意的是appearance 修改权限相对比较大,相当于设置完以后,修改的控件创建的默认值,以后所有创建的该控件都会遵循这个规则来进行创建,比如说button的Title模式是白色,那么你使用appearance方法设置为黑色后,所有新创建的button的Title都会是黑色

[[UINavigationBar appearance]setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:30],NSForegroundColorAttributeName:[UIColor yellowColor]}];

/导航控制器默认自带一个手势,边界检测手势,当触发从左边界向右拖动的时候,会触发返回,有一个渐变的效果,底层逐渐清晰,上层逐渐模糊,那么如果你在下个界面设置了返回按钮,自己实现返回,那么该手势就默认被关闭/

5.自定义

直接建立基类Controller 带有共同的属性 在里面实现一些view并且隐藏bar 然后让需要进栈的页面继承这个类,这样就都有bar 和一些 item了 然后

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

UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:firstVC];

self.window.rootViewController = nav;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: