1、获取一个点的方法CGPointMake
view1.center = CGPointMake(50, 50);
2、设置视图圆角
view1.layer.cornerRadius = 10;
view1.clipsToBounds = YES
设置背景图片和layer的圆角一致
3、将视图放到顶层
[self.view bringSubviewToFront:view1];
4、将视图放到底层
[self.view sendSubviewToBack:view1];
5、在父亲View1上,将view3视图插入view2下面
[view1 insertSubview:view3 belowSubview:view2];
6、添加一个轻触手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dealTap)];
[photoView addGestureRecognizer:tap];
后面实现一个dealTap方法即可
7、单次动画
[UIView animateWithDuration:4 delay:0 options:UIViewAnimationOptionAutoreverse animations:^{
bullet.frame = CGRectMake(300, 450, 50, 50);
//bullet.alpha = 0;
} completion:^(BOOL finished) {
[bullet removeFromSuperview];
}];
使用textField的代理功能
textField.delegate = self;
调用者(当前控件)作为textField的代理;
继承<UITextFieldDelegate>协议;
实现方法:-(BOOL)textFieldShouldReturn:(UITextField *)textField
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
//放弃作为第一响应者
[textField resignFirstResponder];
return YES;
}
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(dealLoop:) userInfo:nil repeats:YES];
[iconImage setImageWithURL:[NSURL URLWithString:_model.iconUrl]];
12、对于按键上的图片和文字,只能使用set打头的方法对各种状态分别设置。
13、可变数组不能在遍历的同时删除,需要先将需删除的对象放到另一个数组,最后按数组删除
最后证明:应该
14、
给按键添加响应事件
[_fireButton addTarget:self action:@selector(dealButton:forControlEvents:UIControlEventTouchUpInside];
15、轻触手势
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(movePlane:)];
[_plane addGestureRecognizer:pan];
16、判断两个控件是否相交
(CGRectIntersectsRect(A.frame, B.frame)
作用例:飞机大战中判断子弹是否击毁飞机
17、对于可变数组NSMultableArray的遍历删除操作
for (int i=0; i<_bulletArray.count; i++) {
Bullet *b = _bulletArray[i];
if(b.isDie)
{
[_bulletArray removeObject:b];
[b removeFromSuperview];
//最重要的一步:每删除一个元素,其后所有元素下标都会向前偏移一位
i--;
}
}
18、延时执行方法
[self performSelector:@selector(dealDeleteBomb:) withObject:imageView afterDelay:time];
参数1:延时方法;参数2:方法参数;参数3:延时时间
作用实例:飞机大战爆炸效果容器View的删除
19、音乐效果
使用AVFoundation.framework框架
使用方法:
(1)在general标签中添加AVFoundation框架
(2)#import <AVFoundation/AVFoundation.h>
(3)通过bundle获取mp3音频路径
(4)创建播放器
(5)设置重复次数和音量
(6)play方法播放
//添加背景音乐
//AVFoundation - game_music.mp3
NSString *path = [[NSBundle mainBundle] pathForResource:@"game_music.mp3" ofType:nil];
_backAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:nil];
_backAudioPlayer.numberOfLoops = -1;
_backAudioPlayer.volume = 0.3;
[_backAudioPlayer play];
20、
AppDelegate的第一个方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
在这个方法里设置self.window.rootViewController为哪个ViewController,哪个ViewController就会被第一个加载显示
(优先级大于箭头,突破箭头限制)
21、
从一个控制器A页面跳到控制器B页面方法:
控制器A presentViewController 控制器B
控制器B返回控制器A:
控制器B dismissViewControllerAnimated
22、
控制器之间四种传值方式
以A->B->C->D为例
(1)正向传值(登陆页面后主页面显示帐号信息)
A传值给B,A中直接给B中属性赋值
(2)反向传值(设置好友备注后,前一个界面要收到新备注显示)
B传值给A,
block法:A中实现一个block,《调B前》扔给B的block属性,B在《回A前》拿值触发block,A中执行block完成B向A传值
代理法:B定义协议(方法定义)和代理,B在《回A前》拿值触发代理执行协议方法
A遵循协议,实现协议方法,A在《调B前》将自己赋值给B代理属性,
在B触发代理事件时A中执行代理方法,完成B向A传值
(3)单例传值(设置版本号)
通过单例方法创建单例对象给所有控制器访问
(4)通知传值(设置主题)
实现一个单例,并通过NSString作为索引;
广播端:
//发出改变主题的通知
//获取通知中心对象
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
//参数1: 通知名字, 任意, 接受通知对应
[center postNotificationName:@"ChangeTheme" object:nil userInfo:@{@"color":[UIColor yellowColor]}];
接受端:
创建监听者,设置监听到通知后的处理方法
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealChangeTheme:) name:@"ChangeTheme" object:nil];
对通知的数据处理方法
-(void)dealChangeTheme:(NSNotification *)n
{
//获取通知中传过来的数据
NSDictionary *userinfo = n.userInfo;
self.view.backgroundColor = userinfo[@"color"];
}
23、通过info.plist设置状态栏高亮
24、
导航栏的创建:
在appDelegate.m
创建一个主界面控制器
创建一个导航栏控制器,设置主界面
将项目窗口的根控制器设置为导航栏控制器
设置导航栏图片
注意: 图片两种大小
如果高度44, 只显示在导航栏区域
如果高度64, 扩展到状态栏
MainViewController *mvc = [[MainViewController alloc] init];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:mvc];
self.window.rootViewController = nc;
25、在主界面加载其他界面
旧方法回顾:
A加载B,A使用present加载,B使用dismiss退回
新的方法:使用导航栏控制器+栈完成
A加载B
A压栈加载B:
[ws.navigationController pushViewController:cvc animated:YES];
B弹栈退回A
[self.navigationController popViewControllerAnimated:YES];
ps:默认Navigate的每一次压栈,新界面导航栏上都有一个默认左按钮会弹栈退回A
26、
导航添加按键
注意:
一定要在self.navigationItem.rightBarButtonItem上添加
步骤:
创建按键
创建UIBarButtonItem
给self.navigationItem.rightBarButtonItem赋值
26、navigater的工具栏toolbar
默认隐藏,下面这一句解除隐藏
self.navigationController.toolbarHidden = NO;
添加工具栏按键(和导航栏按键一样)
UIBarButtonItem*item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil action:nil];
添加工具栏空白按键,设置合适的宽度用于填充
UIBarButtonItem *spaceCustumItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
spaceCustumItem.width = 100;
设置工具栏数组(顺序即布局)
self.toolbarItems = @[item1,spaceCustumItem,item2,spaceCustumItem,item3];
27、tabBar标签栏(最大的分类)
确定标签栏一共总控几个界面,有几个界面就创建几个控制器
{
创建界面控制器A
创建导航栏,设置导航栏根控制器为A
设置每个控制器的title字符串
设置每个控制器的tabbar image
}
上述步骤有几个大类界面执行几次
创建标签栏
赋值标签栏ViewControllers数组为上面创建的所有导航栏控制器
设置标签栏背景图高度(必须为49)
设置标签栏标签被选中时颜色
设置当前工程根控制器为标签栏控制器
28、自己调用自己的时候会出现循环引用,解决方式就是将其中一个变为弱指针
实例:
__weak typeof (self) ws = self;
[self.view addSystemButtonWithFrame:CGRectMake(100, 100, 100, 30) title:@"返回1界面" action:^(ZTButton *button) {
//切换到导航控制器管理的第一个界面
//[ws.navigationController popToRootViewControllerAnimated:YES];
//之前的界面的指针
NSArray *array = ws.navigationController.viewControllers;
ws.navigationController.navigationBar.hidden = NO;
[ws.navigationController popToViewController:array[0] animated:YES];
}];
[ws.navigationController.view.layer addAnimation:[ws createTransitionAnimation] forKey:nil];
核心动画的设置过程
-(CATransition *)createTransitionAnimation
{
//切换之前添加动画效果
//后面知识: Core Animation 核心动画
//不要写成: CATransaction
//创建CATransition动画对象
CATransition *animation = [CATransition animation];
//设置动画的类型:
animation.type = @"oglFlip";
//设置动画的方向
animation.subtype = kCATransitionFromRight;
//设置动画的持续时间
animation.duration = 1.5;
//设置动画速率(可变的)
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
//动画添加到切换的过程中
return animation;
}
30、
使用通知进行切页操作
在appDelegate.m的第一个方法中,通过判断消息来加载页面
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showLoginPage) name:@"showLoginPage" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showMainPage) name:@"showMainPage" object:nil];
想切页的话,就发消息即可
[[NSNotificationCenter defaultCenter] postNotificationName:@"showMainPage" object:nil userInfo:nil];
UIImage *image = [[UIImage imageNamed:@"rr_pub_button_pressed_silver.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:5];
32、切页操作三种
present/dismiss
push/pop
notify-post/notify-addobserve