控制器管理
博客专区 > 海锋 的博客 > 博客详情
控制器管理
海锋 发表于5个月前
控制器管理
  • 发表于 5个月前
  • 阅读 33
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 在ios当中提供了两个 较特殊的控制器.是专 给我们 来管理控制器 的. 1.UINavigationController. 2.UITabBarController.

导航控制器-UINavigationController

在多控制器开发当中, 第 个界 都是 个控制器.导航控制器可以轻松的完成控制器之间的切换.

导航控制器的View的结构.

导航控制器它是 个控制器,它肯定有 个 的View.

导航控制器标志, 就是上 个条.这个条, 我们叫它导航条.这个导航条它是显 到导航控制器View的上

导航条的Y值是20的位置开始显 ,上 20是状态栏的2位置.导航条的 度是44.(UINavigationBar) 输入图片说明

输入图片说明

导航条的Y值是20, 度是44,但是我们看到的导航条有 个半透明的效果,它是从0位置开始的. 它其实是导航条内部的 个 控件,它超过了导航条的 度, 控件超过 控件也是能够显 的.

UINavigationController使用

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc]; 
// initWithRootViewController 法底层会调 push 法.
[nav pushViewController:vc animated:YES];
  • push
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

通过push 法给导航控制器添加子控制器.导航控制器会把子控制器的View添加到导航控制器专 存放子控制器的View上 .导航控制器的initWithRootViewContorller:设置导航控制器的根控制器.它其实底层调 的就是导航控制器的push 法,把传 的控制器 ,添加为导航控制器的 控制器.

注意:导航控制器必须要有 个根控制器.

导航控制器当中有 个childsViewControllers数组,数组当中存放的都是导航控制器的 控制器.

在每一个控制器当中都能拿到它当前所在的导航控制器.因为当前的控制器是导航控制器的子控制器.

  • pop
//返回上一级
    //popViewController把当前控制器从导航控制器中移除.
    [self.navigationController popViewControllerAnimated:YES];

//返回到导航控制器的根控制器
    [self.navigationController popToRootViewControllerAnimated:YES];

//返回到指定的控制器
    //popToViewController,必须得是当前导航控制器的子控制器.
    //self.navigationController.childViewControllers
    [self.navigationController popToViewController:指定的viewcontroller animated:YES];

NavigationItem

导航条内容,由控制器的navigationItem模型来决定.

常见设置导航条的内容

//设置标题
    self.navigationItem.title = @"标题";
//设置标题为一个UIView控件
    self.navigationItem.titleView = [UIButton buttonWithType:UIButtonTypeContactAdd];
//设置导航条左侧按钮
    //style从ios7设什么属性都是一样.
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:0 target:self action:@selector(back)];

注意://手动实现左侧按钮, 系统返回功能, 就会失效.

//设置图片
    //注意:导航条默认它会把它身上的图片给自动渲染蓝色.
    
   UIImage *image =  [UIImage imageNamed:@"navigationbar_friendsearch"];
   image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    //self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:image style:0 target:self action:@selector(rightClick)];
    
    UIButton *btn = [[UIButton alloc] init];
    [btn setImage:[UIImage imageNamed:@"navigationbar_friendsearch"] forState:UIControlStateNormal];
    [btn setImage:[UIImage imageNamed:@"navigationbar_friendsearch_highlighted"] forState:UIControlStateHighlighted];
    //让按钮的大小自适应.
    [btn sizeToFit];
    
    
    //自定义UIView,必须得要设置尺寸.
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];

开发中一些知识点

1.iOS7之后,只要是导航控制器下的所有UIScrollView顶部都会添加额外的滚动区域64。

//设置当前控制器不要调整ScrollView的contentInsets
    self.automaticallyAdjustsScrollViewInsets = NO;

2.设置导航条隐藏

self.navigationController.navigationBar.hidden = YES;

但是开发中通常导航条隐藏不是直接隐藏的,而是有一个透明度, 根据滚到的位置,设置透明度的

self.navigationController.navigationBar.alpha = 0;

设置导航条透明度为0,没有效果,还是原来的样子.

原因是因为导航条上面那一块并不直接是导航条,它是导航条里面的一个子控件.所以在这里设置它没有效果,因为系统会生成一个半透明的图片

所以在这里我们可以考虑给它设置一个半透明的图片,在这里,有一个模式,必须要传默认UIBarMetricsDefault模式.

[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

在这里发现设为nil的时候,也没有效果,那是因为系统它做了一层判断,它会判断如果传入的系统图片为空的话,它就会帮你生成一个半透明的图片,设置导航条的背景图片.

那在这里传入一张空的图片,然后就有效果了.

[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];

但是设置完后,发现有一根线,这根线其实是导航条的一个阴影.直接把它清空就行了.

[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];

UITabBarController

UITabBarController管理原则

1.添加的所有 控制器都保存在TabBarController的childViewControllers数组当中。所以添加的 控制器也不会被销毁.

2.TabBarController默认做法是把它的第1个子控制器的View添加到TabBarController存放子控器制器的View当中.

3.如果UITabBarController有N个子控制器,那么UITabBar内部就会有N个按钮.

4.点击每 个按钮, 它会先把当前控制器的View从TabBarController存放 控件View的View当 中移除.(只是移除view, 控制器还在数组当中,没有被移除).

5.再把当前选中按钮对应的 控制器的View添加到TabBarController存放 控件View当中.

UITabBarController的基本上使用

UITabBarController的UITabbar的内容由tabBarItem决定

//1.创建窗口
    self.window = [[UIWindow alloc] init];
    //2.设置窗口的根控制器
    //设置UITabBarController为窗口的根控制器
    //UITabBarController它不需要设置根控制器.
    UITabBarController *tabBar = [[UITabBarController alloc] init];
    
    //给UITabBarController添加子控制器.
    //它默认会把第一个子控制器的View添加到UITabBarController存放子控制器的View当中.
    //注明:UIViewController里面有几个子控制器,就会把下面的条分为几部分.
    UIViewController *vc1 = [[UIViewController alloc] init];
    vc1.view.backgroundColor = [UIColor redColor];

//设置标题
    vc1.tabBarItem.title = @"消息";
//设置提醒数字
    vc1.tabBarItem.badgeValue = @"10";
//设置图片
    vc1.tabBarItem.image = [UIImage imageNamed:@"tab_recent_nor"];
//添加子控制器.
    [tabBar addChildViewController:vc1];
共有 人打赏支持
粉丝 2
博文 21
码字总数 25279
×
海锋
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: