码迷,mamicode.com
首页 > 其他好文 > 详细

UINavigationController

时间:2015-04-30 22:01:18      阅读:316      评论:0      收藏:0      [点我收藏+]

标签:navibar   导航栏   

//1.navigationBar 高度为44

 //标题
 self.title  = @"";
 //self.navigationItem.title = @"";
 //self.navigationController.title = @"";
注意:  如果不是UINavigationController自带的,而是UINavigationBar
UINavigationBar继承于UIView的,它里面没有title属性
//调用方法- (void)pushNavigationItem:(UINavigationItem *)item animated:(BOOL)animated;
把UINavigationItem弄到UINavigationBar上,那些title,left,right就在UINavigationItem设置
//titleTextAttributes 通过它你可以设置title部分的字体
     @property(nonatomic,copy) NSDictionary *titleTextAttributes
     //    Keys for Text Attributes Dictionaries
     //    NSString *const UITextAttributeFont;                       value: UIFont
     //    NSString *const UITextAttributeTextColor;                 value: UIColor
     //    NSString *const UITextAttributeTextShadowColor;       value: UIColor
     //    NSString *const UITextAttributeTextShadowOffset;      value: NSValue wrapping a UIOffset struct.
      

     NSDictionary *dict = [NSDictionary dictionaryWithObject:[UIColor yellowColor] forKey:UITextAttributeTextColor];
     self.navigationController.navigationBar.titleTextAttributes = dict;
//副标题
self.navigationItem.prompt = @"";//高度为40

//更改Bar的颜色
UINavigationBar *navBar =        self.navigationController.navigationBar;
 navBar.tintColor = [UIColor yellowColor];
//背景颜色
navBar.backgroundColor = [UIColor blueColor];
//是否透明
navBar.translucent =YES;

//风格
navBar.barStyle = UIBarStyleBlackOpaque;
//    UIBarStyleDefault          = 0,
//    UIBarStyleBlack            = 1,
//    UIBarStyleBlackOpaque      = 1, // Deprecated. Use UIBarStyleBlack
//    UIBarStyleBlackTranslucent = 2  // Deprecated. Use UIBarStyleBlack and set the translucent property to YES
// 自定义背景
    if ([navBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]){
        // UIBarMetricsLandscapePhone
        [navBar setBackgroundImage:[UIImage imageNamed:@"图片名称"] forBarMetrics:UIBarMetricsDefault];
    }
   setBackgroundImage方法的第二个参数:
   UIBarMetricsDefault:用竖着(拿手机)时UINavigationBar的标准的尺寸来显示UINavigationBar
    UIBarMetricsLandscapePhone:用横着时UINavigationBar的标准尺寸来显示UINavigationBar
2.设置navigationitem
 注意:UINavigationItem不是UI,只是一种在UINavigationBar上显示的一些子控件的描述,比如左按钮、中间标题、右按钮

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的话,则不显示任何东西。




设置右边图标的按钮名称及方法(action)实例化有四种方式:NSString(字符串) 、(图片)UIImage 、 systemitem(系统样式)、自定义样式
UIBarButtonItem* rightbutton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemUndo target:self action:@selector(action)];
self.navigationItem.rightBarButtonItem = rightbutton;
 //标题
    UIBarButtonItem *rightbutton1 = [[UIBarButtonItem alloc] initWithTitle:@"right"    style:UIBarButtonItemStyleBordered                                                              target:self  action:@selector(action:)];
   //图片
    UIBarButtonItem *rightbutton2 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"图片"]    style:UIBarButtonItemStyleBordered target:self action:@selector(action:)];
//自定义
    UIButton *button = [[UIButton alloc]init];
    button.frame = CGRectMake(0, 0, 50, 40);
    [button setTitle:@"right" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(action) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *rightbutton3 = [[UIBarButtonItem alloc]initWithCustomView:button];

    //将自定义的segmentegControl添加到titleview的位置中

    NSArray *segmentTextContent = @[ @"Image",@"Text",@"Video", 
                                    ];

    segmentedControl.selectedSegmentIndex = 0;


    segmentedControl.frame = CGRectMake(0, 0, 400.0f, 30.0f);

    [segmentedControl addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged];

    self.navigationItem.titleView = segmentedControl;

     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不同步就会抛出异常。

       下面举个简单抛出异常的例子:

     SvNavChildViewController *childOne = [[SvNavChildViewController alloc] initWithTitle:@"First" content:@"1"];
     [self.navigationController pushViewController:childOne animated:NO];


     // raise exception when the stack of navigationbar and navigationController was not correspond
     [self.navigationController.navigationBar popNavigationItemAnimated:NO];
       当pushViewcontroller的之后,强制把navigationBar中的navigationItem pop一个出去,程序立马挂起。

       


     5、Toolbar

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

     UIBarButtonItem *one = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil];
     UIBarButtonItem *two = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:nil action:nil];
     UIBarButtonItem *three = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:nil action:nil];
     UIBarButtonItem *four = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:nil action:nil];
     UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
     [self setToolbarItems:[NSArray arrayWithObjects:flexItem, one, flexItem, two, flexItem, three, flexItem, four, flexItem, nil]];


     self.navigationController.toolbarHidden = NO;

     6、UINavigationControllerDelegate

       这个代理真的很简单,就是当一个viewController要显示的时候通知一下外面,给你一个机会进行设置,包含如下两个函数:

     - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
     - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
       当你需要对某些将要显示的viewController进行修改的话,可实现该代理。


        7、topViewController Vs visibleViewController

       topViewController代表当前navigation栈中最上层的VC,而visibleViewController代表当前可见的VC,它可能是topViewController,也可能是当前topViewController present出来的VC。因此UINavigationController的这两个属性通常情况下是一样,但也有可能不同。


     8.设置全局navbar ,在application: didFinishLaunchingWithOptions:里
    // 1.设置导航栏背景
    UINavigationBar *bar = [UINavigationBar appearance];
    [bar setBackgroundImage:[UIImage imageNamed:@"xx.png"] forBarMetrics:UIBarMetricsDefault];
    // 状态栏
    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

    // 2.设置导航栏 标题文字属性
    NSMutableDictionary *barAttrs = [NSMutableDictionary dictionary];
    [barAttrs setObject:[UIColor redColor] forKey:NSForegroundColorAttributeName];

    [bar setTitleTextAttributes:barAttrs];

    // 3.按钮
    UIBarButtonItem *item = [UIBarButtonItem appearance];
    [item setBackgroundImage:[UIImage imageNamed:@"xx.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [item setBackgroundImage:[UIImage imageNamed:@"xx.png"] forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];//图片尺寸要设置好,不然出现拉伸
    //按钮文字字体属性
    NSMutableDictionary *itemAttrs = [NSMutableDictionary dictionaryWithDictionary:barAttrs];
    [itemAttrs setObject:[UIFont boldSystemFontOfSize:30] forKey:NSFontAttributeName];
    [item setTitleTextAttributes:itemAttrs forState:UIControlStateNormal];
    [item setTitleTextAttributes:itemAttrs forState:UIControlStateHighlighted];
    [item setTitleTextAttributes:itemAttrs forState:UIControlStateDisabled];

    // 4.返回按钮
    [item setBackButtonBackgroundImage:[UIImage imageNamed:@"Menu@2x.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];



    9.push 动画
    UIViewController *ViewController = [[UIViewController alloc]init];
    //从底部push view
    CATransition *animation = [CATransition animation];
    [animation setType:kCATransitionMoveIn];
    [animation setSubtype:kCATransitionFromTop];
    [animation setDuration:1.0f];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]];
    [self.navigationController pushViewController:ViewController animated:NO];
    [self.navigationController.view.layer addAnimation:animation forKey:@"pushView"];


    10.之间的跳转
    /*
     返回根页面vc用 :
     [self.navigationController popToRootViewController]
     返回指定的某个vc用下面(通过index定位)

     [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];
     或(通过class定位)

     for (UIViewController *controller in self.navigationController.viewControllers) {
     if ([controller isKindOfClass:[你要跳转到的Controller class]]) {
     [self.navigationController popToViewController:controller animated:YES];
     }
     }

UINavigationController

标签:navibar   导航栏   

原文地址:http://blog.csdn.net/kamto_6/article/details/45397793

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!