美文网首页iOS的心路里程
iOS控件--UINavigationController--导

iOS控件--UINavigationController--导

作者: 罂粟之城 | 来源:发表于2018-12-29 16:23 被阅读4次

    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--导

        本文链接:https://www.haomeiwen.com/subject/idcplqtx.html