UINavigationController - iOS - UI基础知识总结12

UINavigationController是IOS编程中比较常用的一种容器,很多系统的控件都有用到,下面介绍几个比较重要或者容易犯错的地方进行讲解



先看一下UINavigationController view的层级


1、navigationItem

  我们都知道navigationItem是UIViewController的一个属性,这个属性是为UINavigationController服务的。文档中是这么解释的“The navigation item used to represent the view controller in a parent’s navigation bar. (read-only)”,即navigation item在navigation Bar代表一个viewController,具体一点儿来说就是每一个加到navigationController的viewController都会有一个对应的navigationItem,该对象由viewController以懒加载的方式创建,稍后我们可以在对象中对navigationItem进行配置,可以设置leftBarButtonItem, rightBarButtonItem, backBarButtonItem, title以及prompt等属性。前三个每一个都是一个UIBarButtonItem对象,最后两个属性是一个NSString类型描述,注意添加该描述以后NavigationBar的高度会增加30,总的高度会变成74(不管当前方向是Portrait还是Landscape,此模式下navgationbar都使用高度44加上prompt30的方式进行显示)。当然如果觉得只是设置文字的title不够爽,你还可以通过titleview属性指定一个定制的titleview,这样你就可以随心所欲了,当然注意指定的titleview的frame大小,不要显示出界


2、titleTextAttributes(ios5.0以后可用)

  这是UINavigationBar的一个属性,通过它你可以设置title部分的字体

下面看一个简单的例子:

NSDictionary *dict = [NSDictionary dictionaryWithObject:[UIColor yellowColor] forKey:UITextAttributeTextColor];
childOne.navigationController.navigationBar.titleTextAttributes = dict;
这个例子就是设置title的字体颜色为黄色(当然也可以设置字体大小)


3、wantsFullScreenLayout

  viewController的一个属性,这个属性默认值是NO,如果设置为YES的话,如果statusbar,navigationbar, toolbar是半透明的话,viewController的view就会缩放延伸到它们下面,但注意一点儿tabBar不在范围内,即无论该属性是否为YES,view都不会覆盖到tabbar的下方。

 

4、navigationBar中的stack

  这个属性可以算是UINavigationController的灵魂之一,它维护了一个和UINavigationController中viewControllers对应的navigationItem的stack,该stack用于负责navigationbar的刷新。“注意:如果navigationbar中navigationItem的stack和对应的NavigationController中viewController的stack是一一对应的关系,如果两个stack不同步就会抛出异常


5、navigationBar的刷新

  通过前面介绍的内容,我们知道navigationBar中包含了这几个重要组成部分:leftBarButtonItem, rightBarButtonItem, backBarButtonItem, title。当一个view controller添加到navigationController以后,navigationBar的显示遵循一下几个原则:

  1)、Left side of the navigationBar

  a)如果当前的viewController设置了leftBarButtonItem,则显示当前VC所自带的leftBarButtonItem。

  b)如果当前的viewController没有设置leftBarButtonItem,且当前VC不是rootVC的时候,则显示前一层VC的backBarButtonItem。如果前一层的VC没有显示的指定backBarButtonItem的话,系统将会根据前一层VC的title属性自动生成一个back按钮,并显示出来。

  c)如果当前的viewController没有设置leftBarButtonItem,且当前VC已是rootVC的时候,左边将不显示任何东西。

  此处注意:5.0中新增加了一个属性leftItemsSupplementBackButton,通过指定该属性为YES,可以让leftBarButtonItem和backBarButtonItem同时显示,其中leftBarButtonItem显示在backBarButtonItem的右边。

  2)、title部分

  a)如果当前VC通过 .navigationItem.titleView指定了自定义的titleView,系统将会显示指定的titleView,此处要注意自定义titleView的高度不要超过navigationBar的高度,否则会显示出界。

  b)如果当前VC没有指定titleView,系统则会根据当前VC的title或者当前VC的navigationItem.title的内容创建一个UILabel并显示,其中如果指定了navigationItem.title的话,则优先显示navigationItem.title的内容。

  3)、Right side of the navigationBar

  a)如果当前VC指定了rightBarButtonItem的话,则显示指定的内容。

  b)如果当前VC没有指定rightBarButtonItem的话,则不显示任何东西。

 

6、Toolbar

  navigationController自带了一个工具栏,通过设置 self.navigationController.toolbarHidden = NO来显示工具栏,工具栏中的内容可以通过viewController的toolbarItems来设置,显示的顺序和设置的NSArray中存放的顺序一致,其中每一个数据都一个UIBarButtonItem对象,可以使用系统提供的很多常用风格的对象,也可以根据需求进行自定义。




在AppDelegate.h中声明属性

<span style="font-size:18px;">#import <UIKit/UIKit.h>
#import "RootViewController.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (nonatomic, retain) RootViewController *rootVC;

@end</span>

在AppDelegate.m中添加导航控制器

<span style="font-size:18px;">#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    
    // 创建根视图控制器
    self.rootVC = [[RootViewController alloc]init];
    
    // 创建导航控制器并把根视图控制器添加上去
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:self.rootVC];
    
    // 将导航控制器设置为window的根视图控制器
    self.window.rootViewController = nav;
    
    // 释放
    [self.rootVC release];
    [nav release];
    
    
    return YES;
}</span>



在RootViewController.m中实现具体操作

<span style="font-size:18px;">- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    // 设置navigationBar的半透明状态(也成为毛玻璃效果,默认是YES)___________________________
    self.navigationController.navigationBar.translucent = NO;
    
    // 设置navigationBar的子类的颜色(返回标志的颜色(左右按钮),不是导航条的颜色)
    self.navigationController.navigationBar.tintColor = [UIColor redColor];
    
    // 设置navigationBar的导航条颜色
    self.navigationController.navigationBar.barTintColor = [UIColor purpleColor];
    
    // 设置navigationBar上的标题的字符串的大小和颜色(所有界面的标题的字符串大小和颜色都会改变)Attribute:属性
    self.navigationController.navigationBar.titleTextAttributes = @{NSFontAttributeName:[UIFont systemFontOfSize:30],NSForegroundColorAttributeName:[UIColor cyanColor]};
    
    // 设置navigationBar的隐藏性(默认是NO)
    // 两种方法都能改变隐藏性,但是本质不同(.hidden和Hidden不能相互制约,底层原理不清楚)
//    self.navigationController.navigationBar.hidden = YES;
//    self.navigationController.navigationBar.hidden = NO;
//    self.navigationController.navigationBarHidden = YES;
//    self.navigationController.navigationBarHidden = NO;
    
    // 设置navigationBar的背景图片
    /*
     图片尺寸不同,导航条显示的效果不同
     1、小于44,将图片拉伸显示在导航条以及状态栏上
     2、等于44,只会在导航条上显示图片
     3、大于44小于64,将图片平铺显示在导航条以及状态栏上
     4、等于64,正好显示在导航条以及状态栏上
    */
//    UIImage *image = [UIImage imageNamed:@"32050.png"];
//    [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
    
    // 设置navigationBar上的标题(navigationItem下的方法)(当前界面的标题)___________________________
    self.navigationItem.title = @"主界面";
    //self.title = @"主界面";(和上面的效果一样,底层实现原理不清楚)
    
    // 设置navigationItem上的titleView(UIView类型)
    // 上面的字体颜色和 navigationBar.tintColor 的设置有关
    // 设置后会覆盖 “主界面” 三个字
//    UISegmentedControl *segment = [[UISegmentedControl alloc]initWithItems:@[@"人类",@"动物"]];
//    segment.frame = CGRectMake(0, 0, 100, 20);// 原点不起作用
//    self.navigationItem.titleView = segment;
//    [segment release];
}</span>



设置导航条上的左右按钮(里面按钮的点击方法不再赘述)

<span style="font-size:18px;">// 设置导航条上的leftBarItem(设置成系统中的其他样式)____________________________
    UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(leftBarItemAction:)];
    self.navigationItem.leftBarButtonItem = item;
    [item release];
    
    // 设置导航条上的leftBarItem(设置成自定义的图片样式)
    UIImage *image = [UIImage imageNamed:@"left.png"];
    UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
    imageView.image = image;
    // 将设置的图片设为左按钮的图标
    item.customView = imageView;
    [imageView release];
    // 打开图片的用户交互
    imageView.userInteractionEnabled = YES;
    // 给imageView添加手势(打开用户交互 点击左按钮也不会有反应)
    UITapGestureRecognizer *leftTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(leftTapAction:)];
    [imageView addGestureRecognizer:leftTap];
    [leftTap release];
    
    // 设置navigationBar上的rightItem
    // 在这里设置导航栏右按钮的点击事件为弹出提示框
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(rightTapAction:)];</span>

参考博客地址http://www.cnblogs.com/smileEvday/archive/2012/05/14/2495153.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值