标签栏控制器总结

 

XLFirstViewController

   //标签栏控制器 UITabBarController

    //标签栏控制器的工作原理和导航控制器的工作原理相同 都是控制视图控制器的层次结构

    //导航控制器管理子视图控制器 是压栈和出栈的操作

    //而标签栏控制器管理的所有子视图控制器 所以子视图控制器是平铺在标签栏控制器上的 所以子视图控制器都处于平级关系

 

 

  //导航控制器上的子视图控制器对象调用navigationItem.title为该视图控制器上的导航条添加标题

    //navigationItem这个属性是所有视图控制器对象都能调用的属性 可以通过该属性对导航条上的所有视图进行设置 比如标题、按钮//所有视图控制器对象也都能调用

 

tabBarItem的属性 设置标签栏控制器上的视图内容

    //first.tabBarItem.title = @"界面一";

    //标签栏控制器上可以添加任意类型的视图控制器(导航控制器、自定义视图控制器.....

 

 

 

//标签栏控制器上添加子视图控制器只能一次性添加多个 而不能一个一个的添加

tabBarCtr.viewControllers = arr;

 

 //标签栏控制作为当前窗口的根视图控制器

    //[注意]导航控制器和标签栏控制器可以放在任何位置 不一定只做窗口的根视图控制器

 

 

 

 

 //<1>

    XLFirstViewController * first = [[XLFirstViewController alloc]init];

    first.tabBarItem.title = @"界面一";

    first.tabBarItem.image = [UIImage imageNamed:@"tab_0.png"];

    //[注意]标签栏上的图片按钮 按钮的背景图片必须是背景为无色而且是镂空的 不是任意的图片都可以的

 

 

 

//标签栏控制器上如果子视图控制器的个数多余5 那么就会自动生成一个系统样式的按钮 也就是More

    //More对应的是一个导航控制器 导航控制器的根视图控制器是一个表格视图控制器

    //第五个以及以上的视图控制器的图片按钮存放在表格视图上

 

 

 //<2>同时添加图片按钮及文字标题

    XLSecondViewController * second = [[XLSecondViewController alloc]init];

    UITabBarItem * item2 = [[UITabBarItem alloc]initWithTitle:@"界面二" image:[UIImage imageNamed:@"tab_1.png"] tag:1];

    //此处的tag值为无效值 设置什么值都没关系

    second.tabBarItem = item2;

 

//<3>同时添加文字标题、图片按钮、按钮被选中以后的背景图片

    XLThirdViewController * third = [[XLThirdViewController alloc]init];

    UITabBarItem * item3 = [[UITabBarItem alloc]initWithTitle:@"界面三" image:[UIImage imageNamed:@"tab_3.png"] selectedImage:[UIImage imageNamed:@"tab_c1.png"]];

    third.tabBarItem = item3;

 

 

//<4>添加系统样式的图片按钮

    //系统样式的按钮 标题和图片都是默认的 无需设置标题和背景图片

    XLFourthViewController * four = [[XLFourthViewController alloc]init];

    /*

     UITabBarSystemItemMore,

     UITabBarSystemItemFavorites,

     UITabBarSystemItemFeatured,

     UITabBarSystemItemTopRated,

     UITabBarSystemItemRecents,

     UITabBarSystemItemContacts,

     UITabBarSystemItemHistory,

     UITabBarSystemItemBookmarks,

     UITabBarSystemItemSearch,

     UITabBarSystemItemDownloads,

     UITabBarSystemItemMostRecent,

     UITabBarSystemItemMostViewed,

     */

    UITabBarItem * item4 = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemSearch tag:1];

    four.tabBarItem = item4;

 

 

 

 

 

 //<5>标签栏控制器默认的是第一个子视图显示 也就是默认第一个按钮被选中

    tabBarCtr.selectedIndex = 1;

 //子视图控制器的下标值从0开始

 

 //<6>设置被选中的按钮的背景图片

    first.tabBarItem.selectedImage = [UIImage imageNamed:@"tab_c2.png"];

 

//<7>设置提示信息

    first.tabBarItem.badgeValue = @"99+";

 

===========================================================

 

//真正开发中 工程中固定不变的内容 使用Plist文件存储

    //比如说tabBarController的标题名称 以及按钮图片

 //<1>获取plist文件的路径

    NSString * path = [[NSBundle mainBundle] pathForResource:@"LoveFree" ofType:@"plist"];

 

 //<2>读取plist文件中的内容

    NSDictionary * contentDic = [NSDictionary dictionaryWithContentsOfFile:path];

 

    //<3>字典中键值对的存放是无序的

    //将键的值使用数组存放一下

    NSArray * keysArr = @[@"one",@"two",@"three",@"four",@"five"];

 

 

//<4>创建一个数组 用来存放标签栏控制器上所有子视图控制器对象

    NSMutableArray * subControllers = [[NSMutableArray alloc]init];

 

 

 //<5>

    for(int i = 0;i<keysArr.count;i++)

    {

        //<6>获取每一个小的子视图控制器的内容

        NSDictionary * subDic = [contentDic objectForKey:keysArr[i]];

        //<7>获取视图控制器的字符串名称

        NSString * name_str = [subDic objectForKey:@"controllerName"];

        //<8>将字符串视图控制器名称转化成类名

        Class name_class = NSClassFromString(name_str);

        //<9>创建子视图控制器对象

        UIViewController * controller = [[name_class alloc]init];

        //<10>创建导航控制器对象

        UINavigationController * nav = [[UINavigationController alloc]initWithRootViewController:controller];

        //<11>为导航条添加标题

        NSString * titleStr = [subDic objectForKey:@"tittleName"];

        controller.navigationItem.title = titleStr;

        nav.tabBarItem.title = titleStr;

        

        //<12>获取按钮图片的名称

        NSString * titleNomal = [subDic objectForKey:@"imageName"];

        NSString * titleSelected = [subDic objectForKey:@"selectImage"];

        

        nav.tabBarItem.image = [UIImage imageNamed:titleNomal];

     

        nav.tabBarItem.selectedImage = [UIImage imageNamed:titleSelected];

        

        //<13>将导航控制器添加到数组

        [subControllers addObject:nav];

        

    }

    

    //<14> 创建标签栏控制器对象

    UITabBarController * tabBarCtr = [[UITabBarController alloc]init];

    tabBarCtr.viewControllers = subControllers;

    self.window.rootViewController = tabBarCtr;

 

=================================自定义标签控制器==========================

//将系统提供的tabBar隐藏

    self.tabBar.hidden = YES;

  //将所有子视图控制器添加到上当前视图控制器上

    self.viewControllers = @[first,second,third,fouth];

 

    //系统提供的控件 样式比较单一 而且不能添加属性和方法

    //tabBar的高度49像素

  UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 480 - 49, 320, 49)];

 

    imageView.image = [UIImage imageNamed:@"tabbg.png"];

    imageView.tag = 100;

    [self.view addSubview:imageView];

 

 

/ 创建标签栏按钮

-(void)createUIButton

{

    UIImageView * backImageView = (UIImageView *)[self.view viewWithTag:100];

    //获取按钮之间的间距

    float space = (float)(320 - 4 * 30)/5;

    

    for(int i = 0;i<4;i++)

    {

        UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom];

        btn.frame = CGRectMake(space + (space + 30) * i, (49 - 30)/2, 30, 30);

        

        //模拟按钮没有被选中的背景图片

        NSString * imageNormal = [NSString stringWithFormat:@"tab_%d.png",i];

        [btn setImage:[UIImage imageNamed:imageNormal] forState:UIControlStateNormal];

        

        

        //模拟按钮选中的背景图片

        NSString * imageSelected = [NSString stringWithFormat:@"tab_c%d.png",i];

        [btn setImage:[UIImage imageNamed:imageSelected] forState:UIControlStateSelected];

        

        //模拟初始状态第一个按钮被选中

        btn.tag = i + 1;

        if(btn.tag == 1)

        {

            btn.selected = YES;

        }

        

        //将所有按钮添加到UIImageView

        [backImageView addSubview:btn];

        

        //为按钮添加点击事件

        [btn addTarget:self action:@selector(pressBtn:) forControlEvents:UIControlEventTouchUpInside];

        

        //【重点+注意】图片视图上添加按钮 按钮失去与用户交互的能力 必须开启图片视图的用户交互权限

        backImageView.userInteractionEnabled = YES;

    }

}

 

 

-(void)pressBtn:(id)sender

{

    //通过点击按钮 切换视图控制器

    UIButton * btn = (UIButton *)sender;

    //按钮的tag值从1开始 子视图控制的下标从0开始

    self.selectedIndex = btn.tag - 1;

    

    //获取UIImageView上的所有子视图

    UIImageView * imageView  = (UIImageView *)[self.view viewWithTag:100];

    NSArray * subViews = [imageView subviews];

    

    //遍历所有子视图 如果子视图和选中的按钮是同一个 让子视图处于选中状态

    for(UIButton * tempBtn in subViews)

    {

        if(tempBtn.tag == btn.tag)

        {

            tempBtn.selected = YES;

        }

        else

        {

            tempBtn.selected = NO;

        }

    }

 }

 

================================================

 

 

 //CALayerUIView视图的关系:

    

    //CALayer UIView 都继承于同一个父类 NSObject

    //但是UIView的直接父类UIResponder CALayer的直接父类是NSObject

    //所有UIView视图较CALayer多出一个与用户交互的权限

    //UIView主要用于显示视图内容 CALayer主要用作对视图内容的操作 以及对视图动画的描述

    //UIView视图和CALayer是相互依赖的关系

    //UIView视图可以通过CALayer设置边框、圆角等样式  也可以通过CALayer直接添加动画效果

 

 

 

    //CALayer有自带的动画效果类

    //CALayer一般的时候我们称其为动画效果图层

    //<1>

 CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform"];

    //<2>

    animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(3.14, 1.0, 1.0, 1.0)];

    //<3>

    animation.duration = 2;

    //<4>

    animation.repeatCount = 4;

    //<5>阻尼运动 属性值必须设置 如果不设置动画效果不连贯

    animation.cumulative = YES;

 

    //<6>将动画效果添加到UIImageView

    [imageView.layer addAnimation:animation forKey:@"animation"];

 

 

=========================quartzcore================================

 

 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    //<1>获取手指点击屏幕位置的坐标

    UITouch * touch = [touches anyObject];

    CGPoint point = [touch locationInView:self.view];

    

    //<2>在点的周边设置一个层

    CALayer * waveLayer = [CALayer layer];

    

    //<3>设置层的显示位置

    waveLayer.frame = CGRectMake(point.x - 1, point.y - 1, 10, 10);

    

    //<4>设置层的边框颜色

    int num = arc4random() % 7;

    

    switch (num)

    {

        case 0:

            waveLayer.borderColor = [[UIColor redColor] CGColor];

            break;

        case 1:

            waveLayer.borderColor = [[UIColor yellowColor] CGColor];

            break;

        case 2:

            waveLayer.borderColor = [[UIColor blueColor] CGColor];

            break;

        case 3:

            waveLayer.borderColor = [[UIColor greenColor] CGColor];

            break;

        case 4:

            waveLayer.borderColor = [[UIColor cyanColor] CGColor];

            break;

        case 5:

            waveLayer.borderColor = [[UIColor magentaColor] CGColor];

            break;

        case 6:

            waveLayer.borderColor = [[UIColor orangeColor] CGColor];

            break;

        default:

            break;

    }

    //<5>设置layer的边框宽度

    waveLayer.borderWidth = 0.5;

    //<6>设置layer的圆角效果

    waveLayer.cornerRadius = 5;

    //<7>layer添加到当前视图的层上

    [self.view.layer addSublayer:waveLayer];

    

    //<8>让圈等比例增大

    [self changeLayer:waveLayer];

}

 

 

// 

-(void)changeLayer:(CALayer *)layer

{

    //<9>设置layer大小的边界值

    const int maxScale = 120;

    //<10>当层扩大到120倍的时候就让它从界面消失

    if(layer.transform.m11 < maxScale)

    {

        [layer setTransform:CATransform3DScale(layer.transform, 1.1, 1.1, 1.0)];

        [self performSelector:_cmd withObject:layer afterDelay:0.05];

        

        //performSelector:用于方法的调用

        //递归调用自身方法 layer逐渐变大

        //_cmd表示调用自身方法名称

    }

    else

    {

        [layer removeFromSuperlayer];

    }

}

 

 

posted @ 2015-08-23 22:25  BN笨的很想飞  阅读(267)  评论(0编辑  收藏  举报