iOS控件--UINavigationController--导航控制器

UINavigationBar(导航条):是通常位于屏幕顶端的控件,继承UIView控件;以stack形式来管理多个UINavigationItem,只是作为UINavigationItem的容器。

UINavigationItem(导航项):也是作为一个容器,它由标题、左边N个按钮、右边N个按钮组成,每个按钮都是UIBarButtonItem(按钮)控件

下面先讲述 UINavigationBar + UINavigationItem + UIBarButtonItem ,然后主要 UINavigationController 导航控制器最主要。

UINavigationBar/UINavigationItem用法:

    1.创建导航条
        UINavigationBar *navBar=[[UINavigationBar alloc]initWithFrame:CGRectMake(CGFloat x,y,width,height);
    2.将导航条加入到视图中
        [self.view addSubview:navBar];
        [navBar setTintColor:[UIColor whiteColor]];//设置导航条上的按钮字体颜色。
     //[navBar setBackgroundColor:[UIColor redColor]];//这个方法是用来设置位于栈底的背景色的吧
        [navBar setBarTintColor:[UIColor redColor]];//设置导航条navigationBar的背景色
    3.创建导航项UINavigationItem,并将此导航项加入到导航条UINavigaionBar中
        UINavigationItem* navItem=[[UINavigationItem alloc]initWithTitle:@"导航条标题"];
        navBar.items=[NSArray arrayWithObjects:navItem,nil];
    4.创建导航条按钮,按钮是加入到UINavigationItem中
        //创建一个按钮作为导航条的左边按钮
        UIBarButtonItem *barButton=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(---)/nil];
        navIte.leftBarButtonItem=barButton;
        //创建多个按钮作为导航条的按钮,使用NSArray数组
        UIBarButtonItem *barButton=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(clickLeftButton)];
         UIBarButtonItem *spaceItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
         UIBarButtonItem *buttonImage=[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"返回按钮普通32"] style:UIBarButtonItemStylePlain target:self action:@selector(clickLeftButton)];
         navItem.leftBarButtonItems=[NSArray arrayWithObjects:buttonImage,barButton,spaceItem,nil];//把barButton按钮设置为导航条的右边的按钮

UIBarButtonItem用法:

    有两个常用方法:        
        - (instancetype)initWithTitle: style:(UIBarButtonItemStyle)style target:target action:action;
        - (instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:target action:action; 
        - (instancetype)initWithCustomView:(UIView *)customView;
    
    其中在UIBarButtonItem中区分UIBarButtonItemStyle和UIBarButtonSystemItem;
        UIBarButtonItemStyle(三个)分类:
            UIBarButtonItemStylePlain,
            UIBarButtonItemStyleBordered,
            UIBarButtonItemStyleDone;
        UIBarButtonSystemItem分类:
            UIBarButtonSystemItemDone,UIBarButtonSystemItemCancel,UIBarButtonSystemItemEdit,UIBarButtonSystemItemSave,UIBarButtonSystemItemAdd,
            UIBarButtonSystemItemFlexibleSpace,UIBarButtonSystemItemFixedSpace,
            UIBarButtonSystemItemCompose,
            UIBarButtonSystemItemReply,
            UIBarButtonSystemItemAction,
            UIBarButtonSystemItemOrganize,
            UIBarButtonSystemItemBookmarks,
            UIBarButtonSystemItemSearch,
            UIBarButtonSystemItemRefresh,
            UIBarButtonSystemItemStop,
            UIBarButtonSystemItemCamera,
            UIBarButtonSystemItemTrash,
            UIBarButtonSystemItemPlay,
            UIBarButtonSystemItemPause,
            UIBarButtonSystemItemRewind,
            UIBarButtonSystemItemFastForward,

UINavigationControl用法:

导航控制器。一般会先在代理中操作,导入一个视图控制器作为导航视图控制器的根视图,然后把导航视图作为整个视图的根视图。

    *在代理文件AppDelegate.m文件中(*经过测试后UINavigation只可以用在代理文件中进行设置,其它方法均不可以用)
        1.先设置屏幕宽度和背景色
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        self.window.backgroundColor = [UIColor whiteColor];    
        2.导入一个视图将作为导航视图控制器的根视图控制器,然后在把导航视图控制器作为整个视图的根视图控制器。
        ViewController *VC1 = [[ViewController alloc]init];
        UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:VC1];//将VC1作为UINavigationController根视图。
        [_window setRootViewController:nav];//将导航视图nav作为window的根视图控制器。
       [self.window makeKeyAndVisible];
       
    ——转入到导航视图控制器的根视图控制器中
        1.设置导航条的标题:self.title=@"导航条的标题";
        2.设置navigationBar导航栏的背景颜色:[self.navigationController.navigationBar setBarTintColor:[UIColor ...]];
        3.设置navigationBar导航栏上的按钮(返回/右边按钮)的文字的颜色:[self.navigaitonController.navigationBar setTintColor:[UIColor ...]];//tintColor影响所有按钮标题和按钮图像
        4.设置navigationBar导航栏上标题字体颜色:[self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],UITextAttributeTextColor,nil]];/[... setTitleTextAttributes:@{UITextAttributeTextColor:[UIColor whiteColor]}] 
            实现3的另一种方法:
                [[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];  
                //@{}代表Dictionary  
                [[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}]; 
        >改变导航栏标题的字体属性:
            UITextAttributeFont - 字体
            UITextAttributeTextColor - 文字颜色
            UITextAttributeTextShadowColor - 文字阴影颜色
            UITextAttributeTextShadowOffset - 偏移用于文本阴影
                NSShadow *shadow = [[NSShadow alloc] init];  
                shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];  
                shadow.shadowOffset = CGSizeMake(0, 1);  
                [self.navigationController.navigationBar setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:  
                                                [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,  shadow, NSShadowAttributeName,  
            [UIFont fontWithName:@"HelveticaNeue-CondensedBlack" size:21.0], NSFontAttributeName, nil]];
        5.设置左右按钮:self.navigaitionItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"左边按钮" style:UIBarButtonItemStylePlain target:self action:nil];self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"右边按钮"style:UIBarButtonItemStylePlain target:self action:nil];
        (在设置左右按钮时,使用UINavigationController时,自定义的按钮会覆盖系统自带的按钮)
    ——6.设置返回按钮字体自定义:self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"我的返回按钮" style:UIBarButtonItemStyleDone target:nil action:nil];
        -或者直接使用UIBarButtonItem创建按钮改变字体大小、颜色,UIBarButtonItem *bBtn=[...];[btn setTitleTextAttributes: forState:];[bBtn setTitle:@" "];
        7.图片作为导航栏标题使用titleView:self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"。。"]]; 
        8. 设置导航栏半透明:self.navigationController.navigationBar.translucent=NO;
        8. 从导航栏下面开始算坐标(不考虑导航栏):self.edgesForExtendedLayout=UIRectEdgeNone;

UINavigaitonController 还有push/pop操作

在一个视图中 

[self.navigaitonController pushViewController:VC animated:YES]; // 入栈某个VC
[self.navigaitonController popToViewController:VC animated:YES]; // 出栈某个VC
[self.navigaionController popViewController:YES]; //  当前当前最顶部控制器VC

即可实现该视图出栈就可以返回到跳转到那个的视图。

关于在使用UINavigationController的各种自定义:

1.iOS导航栏返回按钮自定义 -- 自定义文字和图像

>> 1) 自定义文字--想要返回按钮显示不同的文字,只需在父视图进行这样修改:
//重新创建一个barButtonItem
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@"你想要设置的返回按钮文字" style:UIBarButtonItemStylePlain target:nil action:nil];

//设置backBarButtonItem即可
self.navigationItem.backBarButtonItem = backItem;
其中在这里,如果不想让返回按钮显示任何文字,有两种方式:
a.如上述方法所示,只要设置barButtonItem的title为""即可;
b.也可以在本视图中通过[UIBarButtonItem appearance]对文字的范围进行设置,就像这样:
 [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin) 
                                                     forBarMetrics:UIBarMetricsDefault];  

>> 2)自定义返回图片- -提供三种方法

a.网上常用做法

就是在本视图中自定义一个UIButton,然后设置UIButton的图片,再给UIButton添加事件进行返回上级视图的操作,代码类似于:
//创建一个UIButton
UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
//设置UIButton的图像
[backButton setImage:[UIImage imageNamed:@"left_select_img.png"] forState:UIControlStateNormal];
//给UIButton绑定一个方法,在这个方法中进行popViewControllerAnimated
[backButton addTarget:self action:@selector(backItemClick) forControlEvents:UIControlEventTouchUpInside];
//然后通过系统给的自定义BarButtonItem的方法创建BarButtonItem
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
//覆盖返回按键
self.navigationItem.leftBarButtonItem = backItem;
这种方式也可以达到目的,不过通过这种方式自定义返回按钮之后,系统的右滑返回的手势就会无法识别,通常的解决办法是再添加一个全局的手势操作。而且,这个方法自定义完之后的返回按钮一般都会偏右,然后再调位置。
下面的b,c两种方法在使用后右划手势依然存在。

b.在本视图中修改- - 在本方法中设置后,会出现把导航栏标题的位置挤压改变

//方法1:在本视图中设置
UIImage *backButtonImage = [[UIImage imageNamed:@"left_select_img.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 40, 0, 0) 
                           resizingMode:UIImageResizingModeTile];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage
                                                  forState:UIControlStateNormal
                                                barMetrics:UIBarMetricsDefault];
//参考自定义文字部分
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin)
                                                     forBarMetrics:UIBarMetricsDefault];

c.在父视图中修改

//方法2:通过父视图NaviController来设置
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@""
                                                            style:UIBarButtonItemStylePlain
                                                           target:nil
                                                           action:nil];
self.navigationController.navigationBar.tintColor =
[UIColor colorWithRed:0.99 green:0.50 blue:0.09 alpha:1.00];
//主要是以下两个图片设置
self.navigationController.navigationBar.backIndicatorImage = [UIImage imageNamed:@"left_select_img.png"];
self.navigationController.navigationBar.backIndicatorTransitionMaskImage = [UIImage imageNamed:@"left_select_img.png"];
self.navigationItem.backBarButtonItem = backItem;

2.在设置navigationBar底部图片和颜色时,去除导航栏底部的黑线-四种方法

> 方法一.当设置navigationBar的背景图片时移除黑线的方法,该方法会使translucent属性失效
-(void)useShadowImageRemoveBlackLine  
{  
    //通过设置shadowImage移除黑线  
    [self.navigationController.navigationBar setShadowImage:[UIImage new]];  
}
> 方法二.当设置navigationBar的背景图片或背景色时,使用该方法都可移除黑线,且不会使translucent属性失效(推荐)
-(void)useMethodToFindBlackLineAndHind  
{  
    UIImageView* blackLineImageView = [self findHairlineImageViewUnder:self.navigationController.navigationBar];  
    //隐藏黑线(在viewWillAppear时隐藏,在viewWillDisappear时显示)  
    blackLineImageView.hidden = YES;  
}  
- (UIImageView *)findHairlineImageViewUnder:(UIView *)view  
{  
    if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0)  
    {  
        return (UIImageView *)view;  
    }  
    for (UIView *subview in view.subviews) {  
        UIImageView *imageView = [self findHairlineImageViewUnder:subview];  
        if (imageView) {  
            return imageView;  
        }  
    }  
    return nil;  
} 
> 方法三.简单移除黑线方法,会使translucent失效
-(void)useClipsToBoundsRemoveBlackLine  
{  
     //设置移除黑线  
    self.navigationController.navigationBar.clipsToBounds = YES;  
}  
> 方法四.移除黑线(不推荐)
-(void)removeBlackLine  
{  
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new]  
                                      forBarPosition:UIBarPositionAny  
                                          barMetrics:UIBarMetricsDefault];  
    [self.navigationController.navigationBar setShadowImage:[UIImage new]];  
}  

>> 当有多个导航控制器时,一次设置多个导航控制器

    UINavigationBar *navBar = [UINavigationBar appearance] ;
     // 所有导航条颜色都会改变 -- 一键设置
     //navBar.barTintColor = [UIColor yellowColor] ;
     [navBar setBackgroundImage:[UIImage imageNamed:@"bg_nav.png"] forBarMetrics:UIBarMetricsDefault] ;
以上是对 UINavigationController 控件的描述和使用,不以偏概全,只授之以渔,有更好的操作也会及时更新。如果您有 UINavigationController 控件的更好使用欢迎留言交流!

你可能感兴趣的:(iOS控件--UINavigationController--导航控制器)