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;
}
}
}
================================================
//CALayer和UIView视图的关系:
//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];
}
}