IOS开发:导航控制器UINavigationController和选项卡栏控制器UI...
2013-05-07 14:07
621 查看
一、导航控制器
使用术语push(压入)和pop(弹出)分别来描述导航控制器;对于导航控制器下面的场景,也是使用push切换显示的。 1、导航栏、导航项、栏按钮项 导航控制器:除了管理视图控制器以外,它还管理一个导航栏(UINavigationBar),后者类似于工具栏,只是使用的是导航项(UINavigationItem)填充的,该实例被加入到导航控制器管理的每个场景中。 默认情况下,场景的导航项包含一个标题和Back按钮,Back按钮是以栏按钮项(UIBarButtonItem)的方式加入到导航项的,类似栏按钮。 2、导航控制器UINavigationController详解 1)、navigationItem 它是UINavigationController的一个属性,是为后者服务的。每一个加入到UINavigationController的ViewController都会有一个对应的navigationItem,该对象由ViewController以加载的方式创建。 2)、titleTextAttributes 这是UINavigationBar的一个属性,,可以设置title部分的字体。 3)、wantsFullScreenLayout 这是viewController的一个属性,默认为NO。 4)、navigationBar的stack 这个属性是UINavigationController的重点之一,它维护了一个和UINavigationController中的viewControllers对应的navigationItem的stack,该stack用于负责navigationBar的刷新。 注: 如果navigationBar中navigationItem的stack和对应的NavigationController中的viewController的stack是一一对应的关系,那么如果两个stack不同步就会出现异常。 5)、navigationBar的刷新 当一个viewController添加到NavigationController以后,navigationBar的显示遵循以下规则: 1.1、Left side of the navigation a)、如果当前的viewController设置了LeftBarButtonItem,则显示当前VC所自带的leftBarButtonItem。 b)、如果当前的viewController没有设置leftBarButton,且当前VC不是root VC的时候,则显示前一层VC的backBarButtonItem。如果前一层的VC没有显式地指定backBarButtonItem的话,系统将会根据前一层VC的title属性自动生成一个back按钮,并显示出来。 c)、如果当前的VC没有设置leftBackButtonItem,且当前VC已经是root VC的时候,左边将不显示任何东西。 注: 5.0新增的属性leftItemsSupplementBackButton,通过指定该属性指定的titleView,可以让leftBarButtonItem和backBarButtonItem同时显示,其中leftBarButtonItem显示在backBarButtonItem的右边。 1.2、title a)、如果当前VC通过.navigationItem.titleView指定了自定义的titleView,系统将会显示指定的titleView,此处要注意自定义titleView的高度不要超过navigationBar的高度,否则会显示出界。 B)、如果当前VC没有指定titleView,系统将会根据当前VC的title或者当前VC的navigationItem.title的内容创建一个UILabel显示,其中如果指定了navigationItem.title的话,则优先显示navigationItem.title的内容。 1.3、Right side of the navigationBar a)、如果当前VC指定了rightBarButtonItem的话,则显示指定的内容; b)、如果当前VC没有指定rightBarButtonItem的话,则不显示任何东西。 6)、Toolbar NavigationController自定了一个工具栏。 7)、UINavigationControllerDelegate 当一个viewController显示的时候发送通知,给用户一个机会进行设置。当需要对某些将要显示的viewController进行修改的话,可实现该代理。 8)、UINavigationController的viewControllers属性 通过该属性可以实现一次性替换整个NavigationController的层次,可以指定动画。动画将会从当前的NavigationController所显示的VC跳转到所设置的目标viewController的最顶层的那个VC,而中间其他的VC将会被直接从VC层级中移除并添加进来(没有动画)。 9)、topViewController VS visibleViewController 代表当前navigation栈中最上层的VC,而visibleViewController代表当前可见的VC,它可能是topViewController,也可能是当前topViewController present出来的VC。因此这两个属性通常情况下是一样的,但也有可能不同。
二、UINavigationController示例
1、创建项目 创建一个UINavigationControllerDemo项目,这里使用Empty Application模板。 创建一个ViewController,单击左下角的"+"按钮,命名为RootViewController,默认选中With XIB...。 创建好以后,项目会多出三个文件: 打开xib,添加一个按钮控件。 2、添加属性视图 打开AppDelegate.h
#import <UIKit/UIKit.h> @class ViewController; @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; //添加的两项 @property (strong, nonatomic) ViewController *viewController; @property (strong, nonatomic) UINavigationController *navController; @end
打开AppDelegate.m文件
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; //添加代码,创建navController和RootViewController RootViewController *rootView = [[RootViewController alloc] init]; rootView.title = @"Root View"; self.navController = [[UINavigationController alloc] init]; //用push把rootView加入到navController的视图栈中 [self.navController pushViewController:rootView animated:YES]; [self.window addSubview:self.navController.view]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; }
3、添加UIBarButtonItem 分为左右两个。打开RootViewController.m,添加代码
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(selectLeftAction:)]; self.navigationItem.leftBarButtonItem = leftButton; UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(selectRightAction:)]; self.navigationItem.rightBarButtonItem = rightButton; } 这样就添加了UIBarButtonItem,可以运行一下看看。
[self.navigationItem setTitle:@"Contacts"];//设置navigationItem[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"通用头.png"] forBarMetrics:UIBarMetricsDefault];//添加navigationitem的头图片
4、响应UIBarButtonItem的事件的实现 在action:@selector(selectLeftAction:)添加两个方法。打开RootViewController.m文件。 -(void)selectLeftAction:(id)sender{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"点击了导航栏左按钮" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alert show]; } -(void)selectRightAction:(id)sender{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"点击了导航栏右按钮" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alert show]; } 这样点击左右的UIBarButtonItem时,弹出提示消息。
相关文章推荐
- 导航控制器UINavigationController和选项卡栏控制器UI...
- iOS开发UINavigation——导航控制器UINavigationController
- iOS开发UINavigation系列四——导航控制器UINavigationController
- iOS开发利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值
- 【iOS开发-26】利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值
- iOS开发UINavigation——导航控制器UINavigationController
- iOS开发UINavigation系列四——导航控制器UINavigationController
- 【iOS开发-26】利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值
- IOS UINavigationController 导航控制器
- iOS开发UI高级—06使用storyboard创建导航控制器以及控制器的生命周期
- IOS开发-UI学习-UINavigationController(导航控制器)的使用
- 学习iOS自定义导航控制器UINavigationController
- Snail—UI学习之导航视图控制器UINavigationController(系统)
- iOS开发UI高级—04多控制器和导航控制器简单介绍
- Iphone开发(十三)用导航控制器实现视图的分层切换(UINavigationController)
- UI课程 08 导航控制器 UINavigationController 、容器控制器
- Snail—UI学习之导航视图控制器UINavigationController(系统)
- IOS第12天(2,UINavigationController导航控制器)
- IOS开发之导航控制器UINavigationC…
- iOS开发 - 第02篇 - UI进阶 - 07 - 控制器 & 导航控制器