iOS-UINavigationController的学习

 UINavigationController

一、认识导航控制器 

导航控制器常用属性:

 1.UIViewController *topViewController;获取到在栈中最顶层的视图控制器

 2.UIViewController *visibleViewController;获取到在栈中当前显示的视图控制器

 3.NSArray *viewControllers;在栈中当前视图控制器

 4.BOOL navigationBarHidden;隐藏导航栏,默认是不隐藏,NO

 5.UINavigationBar *navigationBar;获取到导航栏目

 常用方法:

 1.initWithRootViewController:初始化一个视图控制器,在栈的最底层

 2.pushViewController:压入到一个新的视图控制器中,在栈的最顶层

 3.popViewControllerAnimated:弹出一个视图控制器

 4.popToViewController:弹出到指定的视图控制器

 5.popToRootViewControllerAnimated:回到根视图控制器


 内存管理:一旦出栈,将被立即释放内存


 一个导航控制器一般包含有四个对象:UINavigationControllerUINavigationBarUIViewControllerUINavigationItem;其中,UINavigationItem存放在UINavigationBar上。

注意1. 一个导航控制器包含多个视图控制器;

2. 一个视图控制器控制一个UINavigationItem(注意,item既不是由navigationController控制,也不是由navigationBar控制,而是由当前视图UIViewController来控制);

3. 一个导航控制器控制一个UINavigationBar(一个UINavigationController只有一个navigationBar)。


 UINavigationItemtitlebackBarButtonItemleftBarButtonItemrightBarButtonItemtitleView ...

 UINavigationBar:backItemdelegatetopItemtranslucent(透明) ...



二、定制导航栏

1.定制标题视图

通过NavigationItem的titleView属性,定制标题视图。titleView属性是一个视图类,因此可以添加一个UIView的实例,也可以添加UIView的子类,也可以在UIView的实例中添加子视图。

UIView *cView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 160, 44)];

cView = [UIColor redColor];

self.navigationItem.titleView = cView;

[cView release];

或者,也许你想用一张图片作为标题:

UIImageView *titleImg = [[UIImageViewalloc]initWithImage:[UIImageimageNamed:@"img_icon_title.png"]];

self.navigationItem.titleView = titleImg;


2.定制左、右栏目

通过对导航栏的结构,我们了解到NavigationItem实例中有一个leftBarButtonItem和rightBarButtonItem,而这两个属性又是一个UIBarButtonItem的实例,因此,通过初始化UIBarButtonItem实例,设置导航栏的左、右栏目项。

定制左、右栏目:

UIBarButtonItem类提供了常用的四个初始化方法,通过这些不同的初始化方法,用户可以得到不同风格的Item。如,可以调用系统的定义的Item,也可以调用用户自定义的Item(图片、标题),用户还可以自定义一个视图。

// 初始化一个带图片的UIBarButtonItem实例

- (instancetype)initWithImage:(UIImage *)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;

// 初始化一个只代标题的UIBarButtonItem实例

- (instancetype)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;

// 初始化一个UIBarButtonItem的实例,初始化一个系统的Item

- (instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action;

// 初始化一个自定义的视图

- (instancetype)initWithCustomView:(UIView *)customView;


3.设置导航栏

#pragma mark - 设置风格

// 设置导航栏的风格为黑色:

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

// 设置导航栏为透明

self.navigationController.navigationBar.translucent = YES;


#pragma mark - 设置颜色

//设置导航栏的颜色

self.navigationController.navigationBar.tintColor = [UIColor redColor];

// 设置自定义颜色,注意每一个颜色的值的范围是0~1之间,最后一个参数是设置透明度

[UIColor colorWithRed:0/255.0  green:125/255.0  blue:122/255.0  alpha:1 ];

// 以图片作为颜色,注意这里是无法设置NavigationBar

[UIColor colorWithPatternImage:[UIImage imageNamed:@"img.png"]];


#pragma mark - 隐藏返回按钮

[self.navigationItem setHidesBackButton:YES];

//隐藏ToolBar

[self.navigationController setToolBarHidden:YES animated:YES];


#pragma mark - 设置prompt属性(现在已经基本不用这个了)

导航栏的prompt属性,通过navigationItem来设置,其主要作用是用于提示用户。比如,用户正在请求网络数据时,提示用户数据正在加载。带加载完成后可以将它的值设置为nil,取消提示。

// 设置导航栏提示用户的内容

self.navigationItem.prompt = @"正在加载中...";

// 取消提示

self.navigationItem.prompt = nil;


4.设置ToolBar

UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 480-44, 320, 44)];

    toolBar.barStyle = UIBarStyleBlackTranslucent;//黑色透明

//    [self.view addSubview:toolBar];

    

    UIBarButtonItem *addItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:nil];

//    自定义的间隔

    UIBarButtonItem *flaxedItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:self action:nil];

    flaxedItem.width = 25;

    

    UIBarButtonItem *saveItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:nil];

    UIBarButtonItem *searchItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:nil];

    UIBarButtonItem *titleItem = [[UIBarButtonItem alloc]initWithTitle:@"title" style:UIBarButtonItemStyleDone target:self action:nil];

//    设置间隔

    UIBarButtonItem *flaxibleItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];

    

    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"img.jpg"]];

    UIBarButtonItem *imageItem = [[UIBarButtonItem alloc]initWithCustomView:imageView];

    

    NSArray *array = @[addItem, flaxedItem, saveItem, searchItem, titleItem, flaxibleItem, imageItem];

    

    [toolBar setItems:array];//自定义的toolBar

    

    [self.navigationController setToolbarHidden:NO animated:NO];//navigation上的toolBar

//注意:    错误的写法:[self.navigationController.toolBar setItems:array animated:YES];

    [self setToolbarItems:array];// 正确的写法



6. 设置代理方法

航控制器的委托方法UINavigationControllerDelegate,通过设置代理监听视图控制器的切换。

// 设置代理方法delegate

self.navigationController.delegate = self;


#pragma mark - 5. UINavigationControllerDelegate监听试图控制器的切换

#pragma mark willShowViewController

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{

    NSLog(@"willShowViewController%p",viewController);

}

#pragma mark didShowViewController

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{

    NSLog(@"didShowViewController%p",viewController);

}


7.自定义导航栏

代码:

// iOS5.0 自定义Bar背景

    if ([self.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {

        

        [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigation"] forBarMetrics:UIBarMetricsDefault];

    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值