11-09 UINavgationController&UIBarButtonItem&UINavgationBar

(一)有时候一个View里面有多个view,这个大的View来管理多个小的view。那么控制器也是这样的,用一个控制器去管理多个控制器。为了便于控制器管理,iOS提供了两个比较特殊的控制器,UINavgationController和UITabBarController。一般来说一个页面就是一个控制器。

(1)导航条的高度是44,最上面20个点是状态栏。加起来是64。然后用于管理多个控制器,直接push控制器就行了。Navgation也是栈的数据结构。每次push是压栈,看到的都是最后创建的那个。通过nav.viewcontrollers属性就能拿到当前所有的控制器。

   
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor clearColor];
    
    UINavigationController *nav = [[UINavigationController alloc] init];
    
    UIViewController *con1 = [[UIViewController alloc] init];
    con1.view.backgroundColor = [UIColor yellowColor];
    
    UIViewController *con2 = [[UIViewController alloc] init];
    con2.view.backgroundColor = [UIColor orangeColor];
    
    [nav pushViewController:con1 animated:NO];
    [nav pushViewController:con2 animated:NO];
    
    // 如果上面动画是NO就是俩,YES就是1,但是数组其实是两个。
    NSLog(@"%@",nav.viewControllers);
   NSLog(@"%@",nav.childViewControllers);
self.window.rootViewController = nav;
  
  [self.window makeKeyAndVisible];

  nav.viewControllers是copy的,nav.childViewControllers是只读的。

  (2)在一个Navgation控制器中,特征表示就是上面有标题。整体是一个NavgationController,上面隔开20状态栏后,44个点是NavgationBar,NavgationBar上面是NavgationItem。如果想要设置一个控制器的“返回”按钮或者类型,那就要在前一个控制器实现。

 

 
    // 如果想要设置一个控制器的返回按钮类型,必须去前一个控制器设置
    // 设置一个控制器的标题用title,这些都是在navgationItem中实现的
    self.navigationItem.title = @"我是第一个控制器";
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"自定义返回" style:(UIBarButtonItemStylePlain) target:nil action:nil];

 

  (3)导航栏的内容修改由栈顶控制器的navgationItem来决定的。

  3.1左上角返回 :UIBarButtonItem :backItem用上一个控制器来控制

  3.2中间标题 : titleView

  3.3中间标题文字 : title 

  3.4左右按钮 : lefr/rightBarButtonItem

 

  所以说,如果要控制颜色,那么bar。如果控制内容,那么item,而控制器就只是控制器。

  特例:修改中间title的时候,可以用bar来修改,代码如下:

 

  // 设置中间标题名字,然后设置Bar的字体字典
    self.navigationItem.title = @"我只是第三个控制器";
    NSDictionary *dict = @{NSFontAttributeName : [UIFont systemFontOfSize:10],NSForegroundColorAttributeName : [UIColor redColor]};
    
    [self.navigationController.navigationBar setTitleTextAttributes:dict];

 

  (4)bar设置一些颜色特效等

  4.1高斯模糊:设置bar的背景颜色后,是渐变的。设置tintColor后,整体默认的渲染蓝色会进行更改。

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"高斯模糊" style:UIBarButtonItemStylePlain target:nil action:nil];
    self.navigationController.navigationBar.backgroundColor = [UIColor orangeColor];
    self.navigationController.navigationBar.tintColor = [UIColor yellowColor];
    

  4.2不渐变,修改整个背景色----》但是这并不是一个纯正的颜色,比一般默认的颜色要深。因为被渲染了,此时要设置一个属性。

 self.navigationController.navigationBar.barTintColor = [UIColor greenColor];
self.navigationController.navigationBar.translucent = false;

  4.3按钮放置图片时候,也是会被渲染的,想要不渲染要默认设置这个图片不渲染: image imageWithRander....一个方法。

(二)总结

// 设置标题
self.navigationItem.title
self.title

// 设置左右按钮
self.navigationItem.leftBarButtonItem
self.navigationItem.leftBarButtonItems
self.navigationItem.rightBarButtonItem
self.navigationItem.rightBarButtonItems

// 设置标题为自定义view
self.navigationItem.titleView

// nav bar 颜色
[self.navigationController.navigationBar setBackgroundColor:[UIColor redColor]]; // 仅仅是导航条的颜色
[self.navigationController.navigationBar setTintColor:[UIColor redColor]]; // 主题(按钮)颜色
[self.navigationController.navigationBar setBarTintColor:[UIColor redColor]]; // 导航条+状态栏颜色

// 设置bar不透明
self.navigationController.navigationBar.translucent = NO;

// 设置自定义标题
// title
NSDictionary* attr = @{ NSFontAttributeName : [UIFont systemFontOfSize:10],NSForegroundColorAttributeName : [UIColor redColor] };
[self.navigationController.navigationBar setTitleTextAttributes:attr];
// titleView
UILabel* titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 44)];
titleLabel.font = [UIFont boldSystemFontOfSize:20];
titleLabel.textColor =[UIColor orangeColor];
titleLabel.textAlignment = NSTextAlignmentCenter;
titleLabel.text = @"自定义标题";
self.navigationItem.titleView = titleLabel;

// 导航条设置自定义图片为按钮(原始图 不渲染)
UIImage* image = [UIImage imageNamed:@"navigationbar_friendsearch_highlighted"];
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

// nav bar
// nav controller
// nav item
// 不解释,自己捋...

 注意:SB做控制器连线跳转。push都是创建一个。所以往回连也是新创建,那么上面的返回按钮就要执行多次才能返回到最底层的跟控制器。此时就只能创建控制器绑定你要返回的控制器纯代码写了。

转载于:https://www.cnblogs.com/aixiaoxin/p/4950262.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值