- 在接收取出来的元素时,一般取出来的是数组,要用数组接,如果是单个元素要用数组的object 0去转换成对象;然后再取其中的属性;
- 网页刷新
- 准备工作:
- 1.再刷新网页时用到了第三方代理,在引入函数前要先添加文件
- EGOTableViewPullRefresh
- 2。添加库文件:QuartzCore.framework
- 3.加入代理:1.UITableViewDelegate,
- 2.UITableViewDataSource,
- 3.EGORefreshTableHeaderDelegate
- viewdidload函数内容:
- 1.创建获得内容得数组;
- dataArray=[[NSMutableArray alloc]initWithObjects:@"a",@"b",@"c",@"d" ,nil];
- 2.创建table 并设置代理;
- table=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain];
- table.delegate=self;
- table.dataSource=self;
- [self.view addSubview: table];
- [table release];
- 3.创建刷新视图
- refreashview=[[EGORefreshTableHeaderView alloc]initWithFrame:CGRectMake(0, -460, 320, 460)];
- refreashview.delegate=self;
- 4.添加刷新视图到table中;
- [table addSubview:refreashview];
- //更新上次刷新时间,如果没有只返回date化上次更新时间不跟着刷新
- [refreashview refreshLastUpdatedDate];
- }
- 代理函数内容
- 加载时调用是table 它是个bool值,时时自动调用
- -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view
- {
- NSLog(@"isloading");
- return isloading;
- //是否正在刷新,如果返回no就会在次加载数据,会让数据加载过多
- }
- 时间函数timer调用得方法
- -(void)refresdata
- { //更新数据;
- [dataArray addObject:@"new"];
- [table reloadData];
- [refreashview egoRefreshScrollViewDataSourceDidFinishedLoading:table];
- 一但更新完以后就要把加载函数反回得bool值改变为no便于下次加载;
- isloading=NO;
- }
- //加载更新出发得更新函数;
- -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view
- {
- isloading=YES;
- [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(refresdata) userInfo:nil repeats:NO];
- //注意这里得重复要设置为no,调用一次这个函数才添加一个timer,
- NSLog(@"didTrigger");
- }
- //屏幕滚动时调用
- -(void)scrollViewDidScroll:(UIScrollView *)scrollView
- {
- // 调用这个函数用于调用加载函数并根据不同的状态设置位置;
- [refreashview egoRefreshScrollViewDidScroll:scrollView];
- }
- -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
- { 根据现在更新的状态,打开加载的控制器;
- [refreashview egoRefreshScrollViewDidEndDragging:scrollView];
- }
- //添加上次刷新时间;
- -(NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view
- {
- return [NSDate date];
- }
- //创建tableview的基本函数;
- -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- return dataArray.count;
- }
- -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"ID"];
- if ( cell==nil) {
- cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"] autorelease];
- }
- cell.textLabel.text=[dataArray objectAtIndex:indexPath.row];
- return cell;
- }
- -(void)dealloc
- {
- [dataArray release];
- [super dealloc];
- }
- 9.26 周三
- 数据库操作;
- 进入数据库
- sqlite3 data.db
- 退出数据库
- .quit
- 创建表
- create table Students(name, score);
- 插入数据前看是否有表,没表就创建
- create table if not exists Students(name,score);
- 插入数据
- insert into Students values('kety',89);
- 删除表
- drop table Stufents
- 删除某项数据
- delete from Students where name='hau';
- 修改数据
- update Students set score=55 where name='hahan';
- 排序: 降序排; 默认升序排
- select * from Book order by price desc;
- 排序后显示前几项
- select * from Book order by price desc limit 5;
- 查询某个条件范围的全部数据
- select * from Book where price>40;
- 查询内容中的某一项
- select name from Book;
- 两个表关联查询
- select Students.name, Student1.pro, Students.score from Students join Student1 on Students.name=Student1.name;
- 查询纪录数量;
- select count(*)from Students;
- 前台操作和数据库链接
- 注意:在操作前要导入文件libsqlite3.dylib 导入头文件#import "sqlite3.h";
- self.PATH=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"data.db"];
- 注意: PATH 是接收路径的字符串变量,注意前面要加上self;
- //路径的创建,stringByAppendingPathComponent 给字符串拼接时加斜杠;
- //NSDocumentDirectory 永久保存数据;
- 在出发事件中进行后台操作;
- 增加纪录
- -(void)add
- {
- //打开数据库
- sqlite3 *sql;
- int res =sqlite3_open([PATH UTF8String], &sql);
- if (res!=SQLITE_OK) {
- NSLog(@"open error");
- return;
- }
- //创建表
- NSString *sqlStr=@"create table if not exists Students(name,score)";
- res=sqlite3_exec(sql, [sqlStr UTF8String], NULL, NULL, NULL);
- if (res!=SQLITE_OK) {
- NSLog(@"Create error");
- sqlite3_close(sql);
- return;
- }
- sqlStr =[NSString stringWithFormat:@"insert into Students values('%@','%@')",namefield.text,scorefield.text];
- res=sqlite3_exec(sql, [sqlStr UTF8String], NULL, NULL, NULL);
- if (res!=SQLITE_OK) {
- NSLog(@"insert error");
- }
- sqlite3_close(sql);
- }
- 删除纪录
- -(void)del
- {
- sqlite3 *sql;
- int res =sqlite3_open([PATH UTF8String], &sql);
- if (res!=SQLITE_OK) {
- NSLog(@"open error");
- return;
- }
- NSString *sqlStr=[NSString stringWithFormat:@"delete from Students where name='%@'",namefield.text];
- res=sqlite3_exec(sql, [sqlStr UTF8String], NULL, NULL, NULL);
- if (res!=SQLITE_OK) {
- NSLog(@"delete error");
- }
- sqlite3_close(sql);
- }
- 更新纪录
- -(void)upd
- {
- sqlite3 * sql;
- int res =sqlite3_open([PATH UTF8String],&sql );
- if (res!=SQLITE_OK) {
- NSLog(@"open error");
- return;
- }
- NSString *sqlStr=[NSString stringWithFormat:@"update Students set score='%@' where name='%@'",scorefield.text,namefield.text];
- res=sqlite3_exec(sql, [sqlStr UTF8String], NULL, NULL, NULL);
- if (res!=SQLITE_OK) {
- NSLog(@"UPDATE ERROR");
- return;
- }
- sqlite3_close(sql);
- }
- 查询纪录
- -(void)sel
- {
- sqlite3 *sql;
- int res=sqlite3_open([PATH UTF8String], &sql);
- if (res!=SQLITE_OK) {
- NSLog(@"open error");
- return;
- }
- 创建预处理
- sqlite3_stmt *stmt;
- NSString *sqlStr=@"select *from Students";
- res=sqlite3_prepare_v2(sql, [sqlStr UTF8String], -1, &stmt, NULL);
- if (res!=SQLITE_OK) {
- NSLog(@"prepare error");
- return;
- }
- while (sqlite3_step(stmt)==SQLITE_ROW) {
- charchar *name=(charchar *)sqlite3_column_text(stmt, 0);
- charchar *score=(charchar *)sqlite3_column_text(stmt, 1);
- NSLog(@"%s %s",name,score);
- }
- sqlite3_close(sql);
- }
- 创建新的线程:作用在主线程执行时同时调用另一个线程使不同操作同时执行;用于网络和数据库传送数据时不影响执行其他内容
- 创建新线程:
- //开辟新线程;把读取网络和数据库的内容可以开辟新线程,
- [NSThread detachNewThreadSelector:@selector(thread ) toTarget:self withObject:nil];
- 想要在新线程中执行的内容可以可以写到新线程调用的函数中
- -(void)thread
- {
- //通过函数跳回主线程;
- [self performSelectorOnMainThread:@selector(main1) withObject:nil waitUntilDone:nil];//延时调用函数
- }
- 计时器也可以开辟新线程;所以在网络和数据库传输数据时可以用计时器来替代进程
- //timer也会开辟新线程;可以用来代替线程函数;
- [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(timer) userInfo:nil repeats:YES];
- 在数据库操作时添加,删除,更新的操作思想:
- 1.打开数据库;
- 2.创建操作语句;
- 3.执行语句;
- 4.关闭数据库;
- 9.27 周四
- 引入第三方协议和后台数据库链接;
- 1.先引入数据库文件libsqlite3.dylib 再添加第三方文件FMDB, 引入头文件
- #import "FMDatabase.h"
- 2.实现增,删,改,查功能
- -(void)add
- { //绑定数据库
- FMDatabase *db=[FMDatabase databaseWithPath:PATH];
- BOOL res =[db open];
- if (res==NO) {
- NSLog(@"open error");
- return;
- }
- //执行语句;
- res=[db executeUpdate:@"create table if not exists Students (name,score)"];
- if (res==NO) {
- NSLog(@"creat error");
- [db close];
- return;
- }
- res=[db executeUpdate:@"insert into Students values(?,?)",namefield.text,scorefield.text];
- if (res==NO) {
- NSLog(@"insert error");
- }
- [db close];
- // NSData *data=[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"" ofType:@"png"] ];
- }
- //delete
- -(void)del
- {
- FMDatabase *db=[FMDatabase databaseWithPath:PATH];
- BOOL res =[db open];
- if (res==NO) {
- NSLog(@"open error");
- return;
- }
- res=[db executeUpdate:@"delete from Students where name =?",namefield.text];
- if (res==NO) {
- NSLog(@"delete error");
- }
- [db close];
- }
- -(void)upd
- {
- FMDatabase *db=[FMDatabase databaseWithPath:PATH];
- BOOL res=[db open];
- if (res==NO) {
- NSLog(@"open error");
- return;
- }
- res=[db executeUpdate:@"update set score=77 from Students where name=?",namefield.text];
- if (res==NO) {
- NSLog(@"update error");
- }
- [db close];
- }
- -(void)sel
- {
- FMDatabase *db=[FMDatabase databaseWithPath:PATH];
- BOOL res=[db open];
- if (res==NO) {
- NSLog(@"open error");
- return;
- }
- 预处理数据
- FMResultSet *set=[db executeQuery:@"select * from Students"];
- 遍历数据
- while ([set next]) {
- NSString *name=[set stringForColumn:@"name"];
- NSString *score=[set stringForColumnIndex:1];
- NSLog(@"%@ %@",name ,score);
- }
- 如果图片经过编码转换成data类型存入数据库取出来的方式如下;
- 1.从预处理中取出图片的二进制编码
- NSData *data=[set objectForColumnIndex:1];
- 2.创建存放图片的控件;
- UIImageView *image=[[UIImageView alloc]initWithFrame:CGRectMake(50, 300, 100, 100)];
- 3.将数据转换成image添加到控件中;
- image.image=[UIImage imageWithData:data];
- [self.view addSubview:image];
- [db close];
- }
- sdafggfdhfjgsdfhgjfgkhljkgjfhgfdsaDFGH
- 其他类型数据存入数据库
- 在数据库存储中,可以存储nsstring,nsnumber ,nsdata ;如果想储存其他类型的数字需要将其内容都转换成nsdata类型;
- 将image转换成data类型;然后通过获取data再将其转换成image类型:
- 1.创建image
- UIImage *image= [UIImage imageNamed:@"5.png" ];
- 2.创建data用于存入数据;
- NSMutableData *data=[NSMutableData dataWithCapacity:0];
- 3.创建编码器
- NSKeyedArchiver *arch= [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
- 4.编码图片;
- [arch encodeObject:image forKey:@"image"];
- 5.完成编码
- [arch finishEncoding];
- 6.释放;
- [arch release];
- 7.创建解码器
- NSKeyedUnarchiver *unaarev=[[NSKeyedUnarchiver alloc]initForReadingWithData:data];
- 8.解码图片;
- UIImage *image1=[unaarev decodeObjectForKey:@"image"];
- 9.解码完成
- [unaarev finishDecoding];
- 10.释放
- [unaarev release];
- 11.展示图片
- UIImageView * image2=[[UIImageView alloc]initWithFrame:CGRectMake(30, 300, 100, 100)];;
- image2.image=image1;
- [self.view addSubview:image2];
- 聊天对话框的的气泡拉伸思想: 为了达到不矢真,横向延伸要用用竖向的一条像素按所需长度复制;竖向延伸要拿横向的一条像素按所需长度延伸;
- 具体实现:
- //聊天气泡拉伸
- 1.创建气泡
- image =[UIImage imageNamed:@"5.png"]
- cap:帽子扩展延伸;
- 2。拉伸气泡函数
- image=[image stretchableImageWithLeftCapWidth:14 topCapHeight:14];
- image2.image=image;
- NSString *str=@"abcdet";
- //得到str的尺寸;
- CGSize size=[str sizeWithFont:[UIFont systemFontOfSize:12.0] constrainedToSize:CGSizeMake(200, 1000) lineBreakMode:UILineBreakModeWordWrap];
- 10.8 周一
- 向服务器上传数据
- 1.先添加第三方文件ASIHTTPRequst 导人第三方文件:#import "ASIFormDataRequest.h" 然后添加四个数据库文件 libz.1.2.5.dylib ,MobileCoreServices.framework, Systemconfiguration.framework;, CFNetwork.framework
- 2. 实现上传:
- 1.创建与服务器链接对象;//192.168 .88.8 局域网 获得局域网服务器的网址
- NSURL *url=[NSURL URLWithString:@"http://169.254.59.31/pk.php"];
- 2.创建向服务器发出请求的对象;
- ASIFormDataRequest *asiform=[ASIFormDataRequest requestWithURL:url];
- 3.设置上传内容:上传内容可以是文件,也可以是二进制数据
- 一种函数 [asiform setFile:[[NSBundle mainBundle]pathForResource:@"5" ofType:@"jpg"] forKey:@"image"];
- 第二种函数:[asiform setFile:[[NSBundle mainBundle]pathForResource:@"5" ofType:@"jpg"] withFileName:@"2.png" andContentType:@"image/jpg" forKey:@"image"];
- 不同点:第二种会在服务器端显示你所设置的文件名,如果是二进制数据后者会显示类型,如果是图片会显示图片的缩略图,如果用第一种不能显示其缩略图;
- 4.设置代理,这样就可以使用其函数了;包括上传成功失败的函数
- 5.最后让其上传执行
- [asiform startSynchronous];
- -(void)viewDidLoad
- {
- [super viewDidLoad];
- /*
- 网络接口路径
- 169.254.59.31/pk.php
- 图像上传 post
- 参数
- 图像 image
- 返回:不同内容代表不同的是否成功
- {}
- */
- //创建链接
- NSURL *url=[NSURL URLWithString:@"http://169.254.59.31/pk.php"];
- //创建数据请求
- ASIFormDataRequest *asiform=[ASIFormDataRequest requestWithURL:url];
- 1. [asiform setFile:[[NSBundle mainBundle]pathForResource:@"5" ofType:@"jpg"] forKey:@"image"];
- 2. [asiform setFile:[[NSBundle mainBundle]pathForResource:@"5" ofType:@"jpg"] withFileName:@"2.png" andContentType:@"image/jpg" forKey:@"image"];
- NSData *data=[NSData dataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"5" ofType:@"jpg" ]];
- //上传data类型的内容显示类型;
- [asiform setData:data forKey:@"image"];
- //上传data类型以文件命名,在服务器端显示上传内容;
- [asiform setData:data withFileName:@"5.jpg" andContentType:@"image/jpg" forKey:@"image"];
- asiform.delegate=self;
- [asiform startSynchronous];
- }
- //用于提示上传是否成功或失败;
- -(void)requestFailed:(ASIHTTPRequest *)request
- {
- NSLog(@"error");
- }
- -(void)requestFinished:(ASIHTTPRequest *)request
- {
- NSLog(@"ok");
- }
- 10.9周二
- mp3播放器制作
- 1.加载库文件 AVFoundation.framework和QuartzCore.framework;( 没弄明白这个文件的作用,因为加不加他没什么作用)然后引入头文件
- #import <AVFoundation/AVFoundation.h>
- #import <QuartzCore/QuartzCore.h>
- 2.mp3实现代码
- -(void)viewDidLoad
- {
- [super viewDidLoad];
- //创建播放按钮,并分别为添加事件
- UIButton *play=[UIButton buttonWithType:UIButtonTypeRoundedRect];
- play.frame=CGRectMake(20, 100, 80, 30);
- [play addTarget:self action:@selector(play) forControlEvents:UIControlEventTouchUpInside ];
- [play setTitle:@"play" forState:UIControlStateNormal];
- [self.view addSubview:play];
- UIButton *pause=[UIButton buttonWithType:UIButtonTypeRoundedRect];
- pause.frame=CGRectMake(120, 100, 80, 30);
- [pause setTitle:@"pause" forState:UIControlStateNormal];
- [pause addTarget:self action:@selector(pause) forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:pause];
- UIButton *stop=[UIButton buttonWithType:UIButtonTypeRoundedRect];
- stop.frame=CGRectMake(220, 100, 80, 30);
- [stop addTarget:self action:@selector(stop) forControlEvents:UIControlEventTouchUpInside];
- [stop setTitle:@"stop" forState:UIControlStateNormal];
- [self.view addSubview:stop];
- //创建数据链接
- NSURL *url=[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"withyou" ofType:@"mp3"]];
- player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
- //提前载入随时准备播放
- [player prepareToPlay];
- //创建滑条用于控制音量,声道和播放速率
- UISlider *volslider=[[UISlider alloc]initWithFrame:CGRectMake(50, 50, 200, 0)];
- //音量控制
- volslider.minimumValue=0.0;
- volslider.maximumValue=1.0;
- //声道
- volslider.minimumValue=-1.0;
- volslider.minimumValue=1.0;
- // 变速
- player.enableRate=YES;// 开启加速功能;
- volslider.minimumValue=0.5;
- volslider.maximumValue=2.0;
- volslider.value=1.0;
- //为滑条添加滑动事件,注意出发事件是滑条值改便时;
- [volslider addTarget:self action:@selector(volslider:) forControlEvents:UIControlEventValueChanged];
- [self.view addSubview:volslider];
- [volslider release];
- //创建进度条,控制音频播放进度
- UISlider *proslider=[[UISlider alloc]initWithFrame:CGRectMake(50, 20, 220, 0)];
- //设置进度条最大最小播放百分比
- proslider.minimumValue=0.0;
- proslider.maximumValue=1.0;
- proslider.value=0.0;
- proslider.tag=100;
- [proslider addTarget:self action:@selector(progressSlider:) forControlEvents:UIControlEventValueChanged];
- [self.view addSubview:proslider];
- [proslider release];
- //e ,j 是防止暂停,停止点击超过一次时多次释放timer导致崩溃
- e=1;
- j=1;
- //设置代理
- player.delegate=self;
- //设置音频频率显示条
- for (int i=0; i<4; i++) {
- pro[i]=[[UIProgressView alloc]initWithFrame:CGRectMake(50*i, 440, 200, 0)];
- [self.view addSubview:pro[i]];
- [pro[i] release];
- //旋转进度条,因为要的是弧度所以参数要改变成弧度制
- pro[i].transform=CGAffineTransformMakeRotation(2270 *M_PI/180);
- //设置铆点用于设置旋转围绕点;
- pro[i].layer.anchorPoint=CGPointMake(0.0, 0.0);
- }
- //音频可控用于进度条随音频变动
- player.meteringEnabled=YES;
- }
- //播放完成时调用
- -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
- {
- NSLog(@"success");
- }
- //进度条随音频改变
- -(void)progressSlider:(UISlider *)slider
- {
- player.currentTime=player.duration*slider.value;
- }
- -(void)volslider:(UISlider *)slider
- {
- //声音大小控制
- player.volume=slider.value;
- //声道控制
- player.pan=slider.value;
- //播放速度控制
- player.rate=slider.value;
- }
- //时间控制器调用的函数
- -(void)refresh
- {
- UISlider *proslider=(UISlider *)[self.view viewWithTag:100];
- proslider.value=player.currentTime/player.duration;
- [player updateMeters];
- //刷新频率
- pro[0].progress=[player peakPowerForChannel:0]/-100;
- pro[1].progress=[player peakPowerForChannel:1]/-100;
- pro[2].progress=[player averagePowerForChannel:0]/-100;
- pro[3].progress=[player averagePowerForChannel:1]/-100;
- }
- //播放控制 用添加时间器来控制
- -(void)play
- {
- [player play];
- timer=[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(refresh) userInfo:nil repeats:YES];
- e=1;
- j=1;
- }
- //停止控制 注意e,j是分别用于控制停止按钮,暂停时间器释放,避免时间器重复释放导致的崩溃;
- -(void)stop
- {
- if (e==1&&j==1) {
- [player stop];
- [timer invalidate];
- //如果按停止键,控制进度条也停止
- UISlider *proslider=(UISlider *)[self.view viewWithTag:100];
- player.currentTime=0.0;
- proslider.value=player.currentTime;
- e=0;
- j=0;
- }
- else if(e==1&&j==0)
- {
- UISlider *proslider=(UISlider *)[self.view viewWithTag:100];
- player.currentTime=0.0;
- proslider.value=player.currentTime;
- e=0;
- }
- }
- //控制暂停
- -(void)pause
- {
- if (j==1&&e==1) {
- [player pause];
- [timer invalidate];
- j=0;
- }
- }
- -(void)dealloc
- {
- [player release];
- [super dealloc];
- }
- mp4播放器
- 1.导人库文件 MeduaPlayer.framework. 并导人头文件#import <MediaPlayer/MediaPlayer.h>
- 2. 代码实现解析
- -(void)viewDidLoad
- {
- //创建按钮用于播放控制
- UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
- button.frame=CGRectMake(120, 400, 70, 40);
- [button addTarget:self action:@selector(buttonclick) forControlEvents:UIControlEventTouchUpInside];
- //注意播放控制器又两种一种是播放控制器,MPMoviePlayerController 一种是带view的播放控制器;MPMoviePlayerViewController 二者的不同之处是前者要播放时是将其视图加入主控制视图中[self.view addSubview:play.view];,播放是调用播放函数[play play];后者是将播放控制交给MPMoviePlayerViewController:[self presentModalViewController:play animated:YES]; 这样一开始播放会全屏播放;
- //初始化MPMoviePlayerViewControlle,资源是当前文件
- play1=[[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"4" ofType:@"mp4"]]];
- // play=[[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"3" ofType:@"mp4"]]];
- //初始化MPMoviePlayerController 资源是当前文件
- play=[[MPMoviePlayerController alloc]initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"4" ofType:@"mp4"]]];
- //设置播放器的 frame属性
- play.view.frame=CGRectMake(0, 0, 320, 300);
- //UIImageView *image= [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"1.bmp"]];
- //设置播放器背景色,虽然能设置,但是不支持使用此属性;
- play.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"1.bmp"]];
- //播放器的控制属性,用于控制播放模式默认使嵌入模式;
- play.controlStyle=MPMovieControlStyleEmbedded;
- //播放重复模式,可以用于设置重复播放;
- play.repeatMode=MPMovieRepeatModeOne;
- [self.view addSubview:play.view];
- // play.allowsAirPlay=NO;
- [self.view addSubview:button];
- }
- //控制播放器播放;
- -(void)buttonclick
- {
- [self presentModalViewController:play animated:YES];
- [play play];
- }
- 10.11周四 画图
- 1.画图工具要新建一个uiview文件 然后在这个文件的.m文件中的- (void)drawRect:(CGRect)rect函数中画图
- 2.画各中图的方法
- //图片的绘制
- UIImage* image = [UIImage imageNamed:@"5.png"];
- [image drawInRect:CGRectMake(100, 100, 100, 100)];
- // 文字
- NSString* str = @"ABC";
- [str drawInRect:CGRectMake(100, 100, 100, 50) withFont:[UIFont systemFontOfSize:30.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentLeft];
- //画直线
- 创建画纸
- CGContextRef ref = UIGraphicsGetCurrentContext();
- 画起点:
- CGContextMoveToPoint(ref, 20, 100);
- 添加点
- CGContextAddLineToPoint(ref, 300, 100);
- CGContextAddLineToPoint(ref, 150, 300);
- 封闭图形
- CGContextClosePath(ref);
- //线条颜色
- CGContextSetStrokeColorWithColor(ref, [UIColor blueColor].CGColor);
- 画路径 结束画图
- CGContextStrokePath(ref);
- //线宽
- CGContextSetLineWidth(ref, 20.0);
- //虚线
- float length[] = {40,20,40};
- CGContextSetLineDash(ref, 0, length, 2);
- //注意:参数二是从多少像素开始;
- 参数三是用于实线和间隔循环的数组;
- 参数四是用于要去数组的前几个数循环;
- //线段的样式
- CGContextSetLineCap(ref, kCGLineCapSquare);
- //线段连接处的连接样式
- CGContextSetLineJoin(ref, kCGLineJoinRound);
- CGContextStrokePath(ref);
- //矩形
- CGContextRef ref = UIGraphicsGetCurrentContext();
- //设置矩形的fram
- CGContextAddRect(ref, CGRectMake(100, 100, 200, 100));
- //设置线宽
- CGContextSetLineWidth(ref, 10.0);
- //设施线的颜色
- CGContextSetStrokeColorWithColor(ref, [UIColor greenColor].CGColor);
- //设置填充色;
- CGContextSetFillColorWithColor(ref, [UIColor blueColor].CGColor);
- //注意下面的三个生成图像的方法的不同点
- 1.第一个只画轮廓
- //CGContextStrokePath(ref);
- 2.只填充图像的内部,不现实边框
- //CGContextFillPath(ref);
- 3.边框和填充都显示,注意后面的参数式fill和stroke都有的,一般fill是内部填充的属性,而stroke是线的属性
- CGContextDrawPath(ref, kCGPathFillStroke);
- //圆
- CGContextRef ref = UIGraphicsGetCurrentContext();
- 设置圆的框架大小
- CGContextAddEllipseInRect(ref, CGRectMake(100, 100, 200, 100));
- CGContextStrokePath(ref);
- CGContextRef ref = UIGraphicsGetCurrentContext();
- 画自由圆
- 设置圆心位置
- CGContextMoveToPoint(ref, 150, 150);
- 画圆,第二,三个 是圆心位置,第四个参数是半径 第五,六个参数数是开始和结束的角,角是弧度制,最后一个参数是顺时针和逆时针旋转1表示顺时针,而表示逆时针
- CGContextAddArc(ref, 150, 150, 100, 0, 2270 * M_PI / 180, 1);
- 设置图形填充色
- CGContextSetFillColorWithColor(ref, [UIColor purpleColor].CGColor);
- 填充图形;
- CGContextFillPath(ref);
- 重新设置圆点 ,相当于在新的图层上画图,这样可以为每个图形设置不同的颜色;
- CGContextMoveToPoint(ref, 150, 150);
- CGContextAddArc(ref, 150, 150, 100, 0, 1120 * M_PI / 180, 0);
- CGContextSetFillColorWithColor(ref, [UIColor orangeColor].CGColor);
- CGContextFillPath(ref);
- CGContextMoveToPoint(ref, 150, 150);
- CGContextAddArc(ref, 150, 150, 100, 1120 * M_PI / 180, 2270 * M_PI / 180, 0);
- CGContextSetFillColorWithColor(ref, [UIColor blueColor].CGColor);
- CGContextFillPath(ref);
- //画曲线
- CGContextRef ref = UIGraphicsGetCurrentContext();
- 设置初试点
- CGContextMoveToPoint(ref, 20, 400);
- 画曲线 第二,三个参数是曲线始末两点切线的焦点坐标;后两个参数是末点的坐标;
- CGContextAddQuadCurveToPoint(ref, 0, 100, 300, 400);
- CGContextStrokePath(ref);
- //设置图形的透明度和阴影
- CGContextRef ref = UIGraphicsGetCurrentContext();
- CGContextAddRect(ref, CGRectMake(100, 100, 150, 150));
- CGContextSetLineWidth(ref, 10.0);
- CGContextSetStrokeColorWithColor(ref, [UIColor blueColor].CGColor);
- CGContextSetFillColorWithColor(ref, [UIColor redColor].CGColor);
- //设置图形的透明度
- CGContextSetAlpha(ref, 0.5);
- //设置图形阴影 第二个参数是阴影向又向下的偏移量 ,最后一个参数是羽化程度
- CGContextSetShadow(ref, CGSizeMake(20, 20), 10);
- CGContextDrawPath(ref, kCGPathFillStroke);
- 动画效果总结
- 1.以前给uiview 添加动画效果;
- // [UIView beginAnimations:nil context:nil];
- // [UIView setAnimationDuration:1];
- // //设置动画快慢
- 设置动画的方向
- // [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
- // [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
- // [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
- // [UIView setAnimationDelegate: self];
- 设置动画各阶段的调用的函数;
- // [UIView setAnimationWillStartSelector:@selector(start)];
- // [UIView setAnimationDidStopSelector:@selector(stop)];
- // [UIView commitAnimations];
- CATransition 用时要导人库文件QuartzCore.framework 在加入头文件#import <QuartzCore/QuartzCore.h>
- 初始化
- CATransition *trans=[CATransition animation];
- 设置动画时间;
- trans.duration=1.0;
- 设置动画进入曲线
- trans.timingFunction=UIViewAnimationCurveEaseInOut;
- 设置动画的类型 类型可以直接用字符串;类型为:
- 1. 1. pageCurl 向上翻一页
- 2. pageUnCurl 向下翻一页
- 3. rippleEffect 滴水效果
- 4. suckEffect 收缩效果,如一块布被抽走
- 5. cube 立方体效果
- 6. oglFlip 上下翻转效果
- trans.type=@"rippleEffect";
- 动画进入类型
- // trans.type=kCATransitionFromLeft;
- trans.subtype=kCATransitionFromTop;
- 设置次动画;
- // trans.subtype=kCATransitionFromBottom;
- 设置动画代理
- trans.delegate=self;
- //动画从多少开始;是整个动画的播放百分比
- //trans.startProgress=0.5;
- //动画结束动画从多少结束
- //trans.endProgress=0.8;
- [self.view.layer addAnimation:trans forKey:nil];
- [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
- }
- -(void)animationDidStart:(CAAnimation *)anim
- {
- NSLog(@"strat");
- }
- -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
- {
- //flag 得值表示本次动画是否执行完了
- NSLog(@"stop %d",flag);
- }
- 注:CATransition动画只能在图层上加,所以要切换页view时也要加到view.layer上;如在切换控制器时做法self.navigationController.view.layer addAnimation:tran forKey:nil];
- [self.navigationController pushViewController:rvc animated:NO];
- 其中animated的yes或no没关系;
- 10.12日 地图
- 1.创建地图需要添加库文件:CoreLocation.framework //服务的 定位的 库文件
- MapKit.framework
- 然后添加创建头文件地图类#import <MapKit/MapKit.h>
- 因为用到了类的代理函数需添加协议 <CLLocationManagerDelegate,MKMapViewDelegate>
- 2.代码实线
- 创建两个类 MKMapView *map;
- CLLocationManager *localmanager;
- -(void)viewDidLoad
- {
- //创建地图
- map=[[MKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
- [self.view addSubview:map];
- //定位经纬
- CLLocationCoordinate2D coordinate=CLLocationCoordinate2DMake(40.035731, 116.351008);
- //范围 显示比例 越小越精确
- MKCoordinateSpan span=MKCoordinateSpanMake(0.5, 0.5);
- 将经纬度和显示比例添加到 原始方位中,当打开地图时地图上显示此位置;
- MKCoordinateRegion region=MKCoordinateRegionMake(coordinate, span);
- map.region=region;
- //设置地图的显示类型,卫星图,普通地图,修改过的卫星图;
- //map.mapType=MKMapTypeSatellite;
- //map.mapType=MKMapTypeHybrid;
- //设置map代理
- map.delegate=self;
- //创建位置管理对象;
- localmanager=[[CLLocationManager alloc]init];
- // 地图显示精确度。越精确越费电
- localmanager.desiredAccuracy=kCLLocationAccuracyBest;
- //移动100米更新位置一次
- localmanager.distanceFilter=100;
- [localmanager startUpdatingLocation];
- localmanager.delegate=self;
- //添加大头针 大头针类是单独的文件;是普通的继承nsobject文件 用还需添加代理 <MKAnnotation>
- 实线代理类中的函数
- //设置标题
- -(NSString *)title
- {
- return @"标题";
- }
- //设置副标题
- -(NSString *)subtitle
- {
- return @"副标题";
- }
- //设置将大头针插到的位置;
- -(CLLocationCoordinate2D)coordinate
- {
- CLLocationCoordinate2D cooridinate=CLLocationCoordinate2DMake(40.035731, 116.351008);
- return cooridinate;
- }
- 为了能多插入几个大头针可以更改他们的属性,位置,我们可以创建一个初始化函数,通过创建不同的对象,实现多大头针;
- -(id)initWithTitle:(NSString *)title subTitle:(NSString *)subtitle coordinate:(CLLocationCoordinate2D)coordinate
- {
- self=[super init];
- if (self) {
- _title=title;
- _subtitle=subtitle;
- _coordinate=coordinate;
- 这三个参数都是自定义属性;在返回函数中可以直接分别返回这几个属性
- }
- return self;
- }
- 回到根控制文件创建大头针,用自定义初始化函数初始化大头针;
- MyAnnotion *myann=[[MyAnnotion alloc]initWithTitle:@"标题" subTitle:@"副标题" coordinate:coordinate];
- 给地图添加大头针
- [map addAnnotation:myann];
- 创建一个长压手势,在手势函数中
- UILongPressGestureRecognizer *press=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longpress:)];
- 给地图添加手势
- [map addGestureRecognizer:press];
- [map release];
- }
- 长按触发的手势函数;
- -(void)longpress:(UILongPressGestureRecognizer *)press
- {
- 为了防治一直按键不断的产生大头针 要对按键状态进行判断,只有第一次长按才添加大头针
- if (press.state==UIGestureRecognizerStateBegan) {
- CGPoint piont=[press locationInView:self.view ];
- CLLocationCoordinate2D coordinate=[map convertPoint:piont toCoordinateFromView:map];
- MyAnnotion * annontion=[[MyAnnotion alloc]initWithTitle:@"title" subTitle:@"subtite" coordinate:coordinate];
- //为大头针出现时添加动作;
- [map addAnnotation:annontion];
- }
- }
- //这是地图的协议方法
- //自定义大头针
- -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
- {
- //为了节省内存创建大头针队列,只生成能看见的大头针;
- MKPinAnnotationView *pinView=(MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"ID"];
- //判断是否是用户定义;为了防治把系统的定位标志也改成大头针样式,由于是定位,定位时刻进行,所以回不断的产生大头针,和我们自己定义的大头针没有了区分
- if ([annotation isKindOfClass:[mapView.userLocation class]]) {
- return nil;
- }
- if(pinView ==nil){
- //创建大头针使用我们定义加入地图的大头针;
- pinView=[[[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"ID"]autorelease];
- }
- //展示标题
- pinView.canShowCallout=YES;
- //设置动画
- pinView.animatesDrop=YES;
- //设置针头颜色
- pinView.pinColor=MKPinAnnotationColorPurple;
- 创建视图用于添加到大头针细节视图中
- UIView *leftview=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 20)];
- leftview.backgroundColor=[UIColor greenColor];
- pinView.leftCalloutAccessoryView=leftview;
- //添加按钮用于添加到大头针视图细节的右面;
- UIButton *button=[UIButton buttonWithType:UIButtonTypeDetailDisclosure];
- pinView.rightCalloutAccessoryView=button;
- return pinView;
- }
- //定位函数
- -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
- {
- 把用户的位置属性设为yes来展示用户的位置;
- map.showsUserLocation=YES;
- 设置显示比例
- MKCoordinateSpan span=MKCoordinateSpanMake(0.5, 0.5);
- 创建原始位置属性,此时经纬可以用函数的参数来设置,当前所处的位置;
- MKCoordinateRegion region=MKCoordinateRegionMake(newLocation.coordinate, span);
- 动画添加位置
- [map setRegion:region animated:YES];
- 更新位置
- [localmanager startUpdatingLocation];
- }
- 游戏开发
- cocos2d oc
- cocos2d-x( 中国人维护 不如cocos2d多) 2d-x c++
- cocos2d-android java
- cocos2d-html5
- cocos2d-flash
- cocos2d流程:和电影流程差不多
- 游戏开始:
- 1。初始化
- libs:游戏引擎;
- 加库:opencles.framework(计算机图形学)
- 注:gpu:是数
- 注意:选择白库时选最短得
- plist图片要和png图片名称相同
- 注:在游戏当中一定要注意产生对象的释放;因为内容比较多,如不释放内存泄漏非常严重;
- 游戏一:发射打击;
- 1。加载所需文件: openal.framework ,openGLES.framework,quartacore.framework,audiotoolbox.faramework,avfoundation.framwork,libz.dylib;
- 添加libs文件cocos2d包,再加上所需图片和音乐;
- 2.游戏界面只有一个导演,一个舞台,每个界面相当于一个节目;界面切换靠的是导演指导哪个节目上场;每个节目上要添加层靠曾来展示内容;
- 具体操作是:
- 1.创建导演,并判断是否能运行最新的导演
- BOOL ret = [CCDirector setDirectorType:kCCDirectorTypeDisplayLink];
- //这是功能比较强大的导演;
- if (ret == FALSE) {
- [CCDirector setDirectorType:kCCDirectorTypeDefault];
- CCDirector *director = [CCDirector sharedDirector];
- //创建导演,他是个共享函数,程序始终只有一个导演;
- 这个导演适于所有版本的系统;
- 2.创建舞台
- CGRect rect = self.window.bounds;//得到舞台的尺寸
- 创建舞台view
- EAGLView *glView = [[EAGLView alloc] initWithFrame:rect]
- 3. 导演让屏幕横屏
- [director setDeviceOrientation:kCCDeviceOrientationLandscapeLeft];
- // 设置屏幕为 风景
- // kCCDeviceOrientationLandscapeLeft
- // 竖屏 Portrait 肖像
- 4. 关联导演和glview
- // 让导演知道哪里是舞台
- [director setOpenGLView:glView];
- 5. 设置游戏刷新率
- // 刷新周期 60HZ
- // [director setAnimationInterval:1/60];
- [director setAnimationInterval:1/60.0f];
- 6.把舞台添加到窗口
- [self.window addSubview:glView];
- [glView release];
- // glview计数器是多少 2
- 7.运行第一个节目
- CCScene *s = [StartLayer scene];
- 调用start layer的类函数用于切换节目 [StartLayer scene] 的类函数要些在StartLayer中方便使用
- [director runWithScene:s];
- 让导演运行第一个节目;
- 在运行一个节目时需要注意的点:
- 1。创建切换节目的类函数;
- + (id) scene {
- CCScene *s = [CCScene node];
- CCLayer *l = [StartLayer node];
- [s addChild:l];
- return s;
- }
- node函数是继承node的 初始化函数是[[[self alloc] init] autorelease];用这个函数比较简便;但是初始化时如果对象就以两个可以这样初始化;如果对象很多就不要这样初始化;因为自动释放时间不确定容易占用内存;
- 2.初始化层;
- 注:一开始加载的东西要放在初始化中;
- 创建菜单
- CCMenuItemFont *startItem = [[CCMenuItemFont alloc] initFromString:@"开始游戏" target:self selector:@selector(beginGame)];
- CCMenuItemFont是文字菜单项;有图片菜单项,文本项等等
- 点击菜单项都会出发事件;点击开始游戏菜单项就要出发新节目;在出发函数中要
- CCMenuItem *helpItem = [[CCMenuItemFont alloc] initFromString:@"帮助" target:self selector:@selector(helpGame)];
- // CCMenuItemFont创建一个菜单项
- // cocos2d
- CCMenu *menu = [CCMenu menuWithItems:startItem, helpItem, nil nil];
- 创建菜单,同时加入菜单项;
- [menu alignItemsVertically];
- // menuitem竖直对齐
- // NSArray
- [self addChild:menu];
- // 把menu加入到self
- // addChild: 类似addSubview:
- 点击菜单项都会出发事件;点击开始游戏菜单项就要出发新节目;在触发函数中要要切换节目
- 2.创建新节目:
- CCScene *s = [LoadingLayer scene];//这个函数同样是类函数,
- // 第2个 任何地方都是这样
- CCDirector *d = [CCDirector sharedDirector];获取导演;
- // s 1
- [d replaceScene:s];
- 让新节目代替旧节目; 这个函数的好处是把旧节目释放;不再占用内存
- // [s release];
- // 把当前剧场删掉 然后用新的剧场s
- // 不遵守规矩
- // 在LoadingLayer alloc 在StartLayer中release
- 登陆节目:
- 节目同样要些创建节目的类函数,和上面的写法一样
- 登陆时显示的是一个进度条;通过扩大其中一个进度条的长度来模仿数据加载;
- 初始化函数:
- 在cocos2d中的精灵相当于ui中的图片
- CCSprite *redSprite = [[CCSprite alloc] initWithFile:@"progressbar1.png"];
- // 用图片progressbar1.png来创建一个精灵
- CCDirector *d = [CCDirector sharedDirector];
- CGSize winSize = [d winSize];
- // 取得屏幕当前的宽高
- 设置锚点;锚点相当于图片的基准点;
- redSprite.anchorPoint = ccp(0, 0);
- CGSize redSpriteSize = [redSprite contentSize];
- // 取得精灵自己的宽高
- CGFloat x = (winSize.width-redSpriteSize.width)/2.0f;
- CGFloat y = (winSize.height-redSpriteSize.height)/2.0f;
- 设置精灵的位置;
- redSprite.position = ccp(x, y);
- // redSprite.position = ccp(winSize.width/2, winSize.height/2);
- // 指定它中心位置
- // 设置锚点在父视图中的坐标
- 将精灵添加到图层;
- [self addChild:redSprite];
- [redSprite release];
- 注意局部对象及时的销毁;
- yellowSprite = [[CCSprite alloc] initWithFile:@"progressbar2.png"];
- // yellowSprite.position = ccp(winSize.width/2, winSize.height/2);
- yellowSprite.anchorPoint = ccp(0, 0);
- yellowSprite.position = ccp(x, y);
- //scale是缩放的意思;可以对整体缩放,也可以缩放x和y;
- yellowSprite.scaleX = 0.2f;
- yellowSprite.tag = 100;
- [self addChild:yellowSprite];
- // [NSTimer scheduledTimerWithTimeInterval:<#(NSTimeInterval)#> target:<#(id)#> selector:<#(SEL)#> userInfo:<#(id)#> repeats:<#(BOOL)#>
- //图层也可以添加计时器;不用再创建timer;
- [self schedule:@selector(timer:) interval:0.5f];
- // 每隔0.5s来调用self timer:
- 每隔0。5秒调用的函数;
- - (void) timer:(double)dt {
- // CCSprite *yellowSprite = (CCSprite *)[self getChildByTag:100];
- // getChildByTag:100根据100tag来找ccnode
- // 如果有就返回 否则 nil
- // 取得s的在x上的放大比例 < 1 缩小
- CGFloat scalex = [yellowSprite scaleX];
- scalex += 0.1f;
- [yellowSprite setScaleX:scalex];
- if (scalex >= 1.0f) {
- // 取消定时器
- [self unschedule:@selector(timer:)];
- [[CCDirector sharedDirector] replaceScene:[GameLayer scene]];
- }
- }
- 游戏界面
- 游戏界面同样是通过类函数创建节目;在初始化函数种需要做的工作是加载背景图,和游戏者。创建随时间调用的函数;
- CCSprite *bgSprite = [[CCSprite alloc] initWithFile:@"bg.png"];
- bgSprite.anchorPoint = ccp(0, 0);
- bgSprite.position = ccp(0, 0);
- [self addChild:bgSprite];
- [bgSprite release];
- // 放一个人
- CCSprite *player = [[CCSprite alloc] initWithFile:@"Player.png"];
- CGSize playerSize = [player contentSize];
- CGSize winSize = [[CCDirector sharedDirector] winSize];
- player.position = ccp(playerSize.width/2.0f, winSize.height/2.0f);
- [self addChild:player];
- [player release];
- tagetarray=[[CCArray alloc]init];
- bulletarray=[[CCArray alloc]init];
- [self addTarget];
- [self schedule:@selector(targetTimer:) interval:1.0f];
- [self schedule:@selector(gameLogic)];
- // 如果不写多长时间调用就是每隔1/60.0f 秒调用
- // 缺省touch是关闭的
- self.isTouchEnabled = YES;
- 发子弹需要触摸所以要让屏幕可触摸;
- 创建打击目标调用的函数;
- -(void)addTarget
- { 创建精灵;
- CCSprite * taget=[[CCSprite alloc]initWithFile:@"Target.png"];
- 将精灵添加到数组;用于测试是否被子弹打中;
- [tagetarray addObject:taget];
- CGSize winsize=[[CCDirector sharedDirector] winSize];
- CGSize tagetsize=[taget contentSize];
- 通过随机数获设置精灵的随机高度;注:随机数很大通过取余来控制随机数的范围;
- CGFloat y= tagetsize.height/2.0f+ arc4random()%(int)(winsize.height-tagetsize.height);
- CGFloat x=winsize.width;
- taget.position=ccp(x,y);
- [self addChild:taget];
- [taget release];
- CGPoint dispoint=ccp(0, y);
- 设置动作点,精灵会在设置的时间内从起点运动到目地点;
- CCMoveTo *move=[[CCMoveTo alloc]initWithDuration:2 position:dispoint];
- CGPoint destpoint2=ccp(300,0 );
- 动作点可设置跳跃点
- CCJumpTo *move2=[[CCJumpTo alloc]initWithDuration:2 position:destpoint2 height:200 jumps:1];
- 用来调用某个函数;一般是用来做善后工作;
- CCCallFuncN *finish= [[CCCallFuncN alloc]initWithTarget:self selector:@selector(finish:)];
- 创建队列,调用者会按队列顺序执行;
- CCSequence *squence=[CCSequence actions:move,move2,finish, nil nil];
- 让对象按队列运行;
- [taget runAction:squence];
- [move2 release];
- [move release];
- }
- 触摸函数用于添加子弹;注意触摸函数的写法;函数touch后带es的和ui的触摸函数一样
- -(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- {
- 创建音乐引擎;
- [[SimpleAudioEngine sharedEngine] playEffect:@"pew-pew-lei.caf"];
- CCSprite *bulletsprite=[[CCSprite alloc]initWithFile:@"Bullet.png"];
- bulletsprite.tag=10;
- 创建触摸对象
- UITouch *onetouch=[touches anyObject];
- 获取触摸对象的位置;
- CGPoint touchpoint=[onetouch locationInView:onetouch.view ];
- //注意获取的触摸点时竖屏时的所以得把该点转换成游戏横屏时的触摸点;
- CGPoint glpoint=[[CCDirector sharedDirector]convertToGL:touchpoint];
- CGFloat y=[[CCDirector sharedDirector]winSize].height/2.0f;
- bulletsprite.position=ccp(20,y);
- [self addChild: bulletsprite];
- CCMoveTo * move=[[CCMoveTo alloc]initWithDuration:1 position:glpoint];
- int i=480/glpoint.x;
- CGPoint point=ccp(490, glpoint.y*i);
- //int time=sqrt(glpoint.x*glpoint.x+glpoint.y*glpoint.y)*sqrt((480-glpoint.x)*(480-glpoint.x)+(glpoint.y*i)*(glpoint.y*i));
- CCMoveTo *move2=[[CCMoveTo alloc]initWithDuration:1 position:point];
- CCCallFuncN *finish=[[CCCallFuncN alloc]initWithTarget:self selector:@selector(finish:)];
- 把子弹添加到数组;用于判断是否打中目标;
- [bulletarray addObject:bulletsprite];
- CCSequence *sequence=[CCSequence actions:move,move2,finish, nil nil];
- [bulletsprite runAction:sequence];
- [bulletsprite release];
- [move release];
- // [finish release];
- }
- 判断是否大中目标的函数;用循环数组比较比较范围来获取;
- -(void)gamelogic
- {
- for (CCSprite* bullet in bulletarray) {
- // NSLog(@"%@",bulletarray);
- CGSize buletsize=[bullet contentSize];
- for (CCSprite *taget in tagetarray) {
- CGSize tagetsize=[taget contentSize];
- float x1=buletsize.width;
- float x2=tagetsize.width;
- float max=x1*0.4f+x2*0.4f;
- CGFloat lon =ccpDistance(bullet.position,taget.position );
- 通过比较接触范围来判断是否打中;
- if (lon<=max) {
- //停止动画函数;在这里没有什么作用;
- [taget stopAllActions];
- [bullet stopAllActions];
- 调用释放函数;
- [self finish:taget];
- [self finish:bullet];
- return;
- }
- }
- }
- }
- -(void)addTarget
- 从屏幕上释放精灵;
- -(void)finish:(CCNode *)node
- { 由于数组中添加了对象,释放时也要从数组中去除;
- if (node.tag==10) {
- [bulletarray removeObject:node];
- }
- else
- [tagetarray removeObject:node];
- [node removeFromParentAndCleanup:YES];
- }
- 做游戏地图
- 要学习 : tieldmap:地图编译器
- opengl
- Box2D 物理引擎
- 网络:http gel post1
- http post2
- weibo分享 腾讯微博,uauth2 协议
- domain 协议:1.http://
- 2.ftp://
- 3.
- baidu.com是真正的域名; www.baidu.com是一台机器是二级域名
- 参数间用&隔开,参数名=参数值
- http://www.baidu.com 是缺省的 http://www.baidu.com /index.html/
- 网络访问模式
- 客户端 发出请求 apache2 调用 访问程序
- 要点:
- 网络请求处理 nignx(大量连接时), httplight(联接少的时候),apache2
- 服务器默认路径是/library/web server/document / document 是放网页的文件夹
- 读取这个目录下的iOS1时写法:http://localhost/iOS1
- XXXX.CGi 是服务器程序 cgi-executables 是放可执行程序的文件 在服务器访问中映射是cgi-bin 访问时写成http://localhost/cgi-bin/iOS
- post1真实名字是:application/x-www-form-urlencoded
- 功能强大顺序;
- post2>post1>get
- 他们都是上行协议;都是客户端传给服务器端的, 而服务器传给客户端的没有区分也叫响应;
- 什么时get协议:
- 在网址上写的直接回车能出来的是get协议 get 时传入到网上的东西.又可以定义为只有请求头没有请求体的请求,
- 入网址是http://api.douban.com/cgi-bin?srlaction=232
- 发到网上的时 只有请求头:
- get : /cgi-bin?srlaction=232\r\n
- 请求路径和内容
- host:api.douban.com\r\n
- 请求机器
- \r\n :请求头的结束标志;
- post1 发送格式:
- 请求头:
- post /cgi-bin/get.cgi\r\n
- 请求路径
- host:localhost\r\n
- 请求的机器
- content-type:application/x-www-form-unlencoded\r\n
- 请求协议:post1
- content-length :78\r\n
- 请求体长度
- r\n
- 请求体:
- srclatitude=40.02999&srclongitude=116.3466
- get 缺陷:1.网址不可太长<1024
- 2.不能带密码;
- 3.不能传文件
- post1特点:1.网址小于4g
- 2.可一带密码;
- read(0,input ,lengthjl) :0 指从apache2中读数据
- 套接字:socket
- tcp:用在稳定的连接:可靠的,速度快
- 用于:图片,录音,文字
- udp不可靠的网络连接;非常快,
- 用于:视频,文件,文字
- tcp:网络传输;
- 传输思想:
- 1.服务器端:
- 1.生成服务器并并设置监听接口
- 2.在代理的确实接收到套接字函数中 要调用等待读取函数;这里的等待不是新建立的套接字等待而是让服务器底层新开一个线程等待传人数据;
- 3.在代理的确实接收到数据函数中取得接收到的数据,同时要在建立等待接收数据,等待下一次传输;这时的tag还用先前的;因为tcp网络传输一次建立联系,后面就无须在建立联系;所以省去再和服务器建立联系这个环节;
- 2.客户端:
- 1.生成客户端套接字 ;
- 2. 连接服务器,并设置网络接入入口
- 3.调用代理的以服务器建立连接成功函数。在这里吧连接开关设置为已连连接
- 4.将数据发送到服务器
- - (void) createServer {
- allClientSockets = [[NSMutableArray alloc] init];
- serverSocket = [[AsyncSocket alloc] initWithDelegate:self];
- [serverSocket acceptOnPort:0x1234 error:nil];
- // serverSocket在端口0x1234来等待
- // 也是异步的bind端口
- // serverSocket自动会在0x1234上等待有人来连接我
- }
- - (void) onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket {
- // 只要有人来连接我 这个函数就会被调用
- // newSocket就是系统自动创建的 socket
- // 如果有10个人连接端口 0x1234那么这个函数就会执行10次
- // newSocket
- // newSocket是自动autorelease
- NSLog(@"new connection is coming new %@",newSocket);
- [allClientSockets addObject:newSocket];
- int index = [allClientSockets indexOfObject:newSocket];
- [newSocket readDataWithTimeout:-1 tag:index+100];
- // newSocket来告诉系统来接收到达newSocket的数据
- // -1 一直等待 100 表示
- // 异步读取数据
- }
- - (void) onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
- int index = [allClientSockets indexOfObject:sock];
- NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
- recvMsgView.text = [NSString stringWithFormat:@"%@\n%@", recvMsgView.text, s];
- [s release];
- // 继续发起一个读的操作
- [sock readDataWithTimeout:-1 tag:tag];
- }
- #pragma mark -
- #pragma mark Client Part
- - (void) createClient {
- clientSocket = [[AsyncSocket alloc] initWithDelegate:self];
- isConnected = NO;
- }
- - (void) connectToHost:(NSString *)ip {
- static int index;
- if (index++)
- return;
- // 异步连接ip:0x1234的机器
- [clientSocket connectToHost:ip onPort:0x1234 withTimeout:10 error:nil];
- // 还不知道到底有没有连接成功
- }
- - (void) onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {
- NSLog(@"已经连接上了 %@:%d", host, port);
- isConnected = YES;
- }
- - (void) sendMessage:(id)arg {
- NSString *ip = ipField.text;
- // 192.168.1.23 api.douban.com
- NSString *msg = msgField.text;
- NSData *msgData = [msg dataUsingEncoding:NSUTF8StringEncoding];
- /* 1. 文字 2. 图片 3 图片+文字 4 文字+语音
- // 文字 1 图片 2 语音 3
- type: 1
- subtype: 1
- len :
- 文字内容
- type:2
- subtype:2
- len: 10240
- 图片内容
- type:3
- subtype:1
- len:100
- 文字内容
- subtype:2
- len:200000
- 图片内容
- type:4
- subtype:3
- len:1000000
- 语音内容
- subtype:1
- 文字
- */
- // 端口
- // 第一次发数据就来调用 连接
- // 第二次之后就不用连接了
- [self connectToHost:ip];
- if(isConnected == YES) {
- [clientSocket writeData:msgData withTimeout:10 tag:111];
- // 给clientsocket发送数据 msgData,
- } else {
- }
- }
- - (void) onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag {
- // 一旦发送成功 该函数就会得到调用
- if (tag == 111) {
- }
- }
- udp 网络传输
- 基本思想:
- 1。接收端端:
- 1.创建接收端套接字;
- 2.绑定网络端口
- 3.等待接收数据;
- 4.调用代理接收到数据的函数;取出数据,并开始调用等待函数等待下次数据传输;
- 2. 发送端
- 1.创建发送端套接字
- 2.得到接收端的ip和接收数据的网络端口;将数据发送到该地址;
- 3.通过是否发送成功函数通过判断返回的tag值来判断是否发送成功;
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- ipField = [[UITextField alloc] initWithFrame:CGRectMake(50, 10, 200, 30)];
- ipField.borderStyle = UITextBorderStyleRoundedRect;
- [self.view addSubview:ipField];
- msgField = [[UITextField alloc] initWithFrame:CGRectMake(50, 50, 150, 30)];
- msgField.borderStyle = UITextBorderStyleRoundedRect;
- [self.view addSubview:msgField];
- UIButton *b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- b.frame = CGRectMake(220, 50, 80, 30);
- [b setTitle:@"发送" forState:UIControlStateNormal];
- [b addTarget:self action:@selector(sendMessage:) forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:b];
- recvMsgView = [[UITextView alloc] initWithFrame:CGRectMake(10, 100, 300, 250)];
- recvMsgView.backgroundColor = [UIColor groupTableViewBackgroundColor];
- [recvMsgView setEditable:NO];
- [self.view addSubview:recvMsgView];
- // 1. 创建接收socket
- recvMsgSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
- // 2. 接收的对象要负责绑定bind到本机的一个port
- [recvMsgSocket bindToPort:0x1234 error:nil];
- // recvMsgSocket只能接收 本机的端口为0x1234的数据包
- // 192.168.1.11:0x1234
- // 什么时候绑定成功
- // 3. 接收数据
- [recvMsgSocket receiveWithTimeout:-1 tag:200];
- //-1 表示让让服务器无限等待,去接受数据;如是正数就表示让服务器等待多长时间去接收数据;
- // 这个函数不会blocked
- // 这个函数不会亲自阻塞
- // 操作系统来等 10
- // 告诉系统接收一次
- // 4. ? 数据什么时候来了
- recv2 = [[AsyncUdpSocket alloc] initWithDelegate:self];
- [recv2 bindToPort:0x1235 error:nil];
- // [recv2 receiveWithTimeout:-1 tag:201];
- // 1. 创建发送套接字 只是创建一次
- senderUdpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
- // [senderUdpSocket bindToPort:9876 error:nil];
- // 发送一方绑定端口是没有意义的
- // [senderUdpSocket bindToPort:0x7654 error:nil];
- //对于senderUdpSocket如果没有调用bindToPort那么系统会自动给你选择一个没用的随机的端口
- }
- - (BOOL) onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port {
- if (tag == 200) {
- // 证明端口0x1234上有数据来了
- // data对方传过来的数据
- // host表示是谁传给我的 port不是0x1234是发送方的端口
- // host:port是对方的端口和ip
- // tag就是200
- NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
- NSString *s2 = [NSString stringWithFormat:@"%@:%d %@", host, port, s];
- [s release];
- recvMsgView.text = [NSString stringWithFormat:@"%@\n%@", recvMsgView.text, s2];
- [recvMsgSocket receiveWithTimeout:-1 tag:200];
- }
- return YES;
- }
- - (void) sendMessage:(id)arg {
- NSString *ip = ipField.text;
- // 192.168.1.23 api.douban.com
- NSString *msg = msgField.text;
- NSData *msgData = [msg dataUsingEncoding:NSUTF8StringEncoding];
- // 端口
- short port = 0x1234;
- // 给ip:port发送消息msg
- [senderUdpSocket sendData:msgData toHost:ip port:port withTimeout:10 tag:100];
- // 给ip地址的机器上的一个端口port 发送消息msgData
- // 10 timeout 超时 失败
- // tag 100 表示本次数据包
- // sendData:该函数不会blocked
- // 该函数不会负责真正的发送
- // 只会告诉系统我要发送 tag=100的数据包msgData
- NSLog(@"aa");
- }
- - (void) onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag {
- // 名字为tag的数据包已经发送完成
- if (tag == 100) {
- NSLog(@"数据包100已经发送成功");
- }
- }
- 广播:又叫消息,观察者,通知
- ARC:内存自动管理 不须要release;
- 2。不用[super dealloc]
- 3.不能用aotorelease;
- 单例:一个对象,一个全局对象;
- 1.写一个单例
- 2.单例什么时候释放;不用释放,因为时全局变量
- 3。如何避免实例化 :将init alloc 函数返回空;
- 单例命名规则:currentxxxxx, sharedxxxx, aplication xxx
- arrayWithContentOfFile: 数组解析文件的方法
- //创建三个分栏控制器
- UITabBarItem *barItem1=[[UITabBarItem alloc]initWithTitle:@"首页" image:[UIImage imageNamed:@"关于.png"] tag:0];
- self.vc01.tabBarItem=barItem1;
- //消息图标
- self.vc01.tabBarItem.badgeValue=@"3";//badgeValue是一个属性,指的是消息的提示
- self.vc02.tabBarItem.badgeValue=nil;//这样就显示为空
- [barItem1 release];
- //系统UITableBarItem的图标
- UITabBarItem *barItem2=[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemMostViewed tag:1];
- self.vc02.tabBarItem=barItem2;
- [barItem2 release];
- //系统UITableBarItem的图标
- UITabBarItem *barItem3=[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:3];
- self.vc03.tabBarItem=barItem3;
- [barItem3 release];
- //将三个视图控制器装入到数组中
- // NSArray *arrayVC=[NSArray arrayWithObjects:_vc01,_vc02,_vc03 nil];
- NSArray *arrayVC=[NSArray arrayWithObjects:self.vc01,self.vc02,self.vc03, nil nil];
- //将控制器赋给tabBarControl
- UITabBarController *tabBar=[[UITabBarController alloc]init];
- //接收数组viewControllers
- tabBar.viewControllers=arrayVC;
- //将tabBar设置根视图控制器
- self.window.rootViewController=tabBar;
- [arrayVC release];
- 只要是添加的视图控制器 或是什么管理器的 话 都是加载 根视图控制器rootViewController上面
- 加上UIlable UIButton view等等都是直接添加到window或是view上面的 addSubview方法
- //添加图片视图,视图用addSubview方法来添加 特别是视图
- [sv addSubview:imageView];
- //在视图上面添加图片的一般方法;
- for (int i=0; i<9; i++) {
- //获取每一个图片的 文件名 并且转化成字符串
- NSString *strName=[NSString stringWithFormat:@"17_%d.jpg",i+1];
- //加载图片
- UIImage *image=[UIImage imageNamed:strName];
- UIImageView *imageView=[[UIImageView alloc]initWithImage:image];
- imageView.frame=CGRectMake(20+ 97*(i%3), 20+130*(i/3), 85,120);
- //add方法是添加视图的
- [self.view addSubview:imageView];
- [imageView release];
- }
- //把图片添加到数组里面去 addObject
- NSString *sirName=[NSString stringWithFormat:@"%d.png",i+1];
- UIImage *image=[UIImage imageNamed:sirName];
- [imageArray addObject:image ];
- //随机数 后面是数组元素的个数
- int random=arc4random()%[imageArray count];
- 随机数一般都是需要取模的 相当于是确定生成随机数的范围 不至于太大的数
- 取模规律 8 取模生成的是0,1,2,3,4,5,6,7;
- 往按钮上面添加图片很重要的方法 使得每一个图片都是可以点的 实际实际上点的都是button
- [btn setImage:image forState:UIControlStateNormal];
- //设置按钮的大小 相当于是确定了图片的大小 和 图片视图是差不多的
- btn.frame=CGRectMake(40*i , 40*j, 40, 40);
- objectAtIndex 只适用于集合(数组)。可根据索引获取对象。如:
- NSArray *array=[NSArray arrayWithObjects:@"zhangsan",@"lisi",@"wangwu",nil];
- NSLog("%@",[array objectAtIndex:0]);
- 这时输出的值是'zhangsan' .可以看出objectAtIndex 消息是从下标0开始。
- objectAtIndex从0开始 即第一个元素的位置是0
- objectAtIndex 一般在数组操作中用到。但是这个数组必须是你能控制的,就是说你必须清楚地知道第几个元素是什么内容。
- 如果你不清楚你需要的元素在什么位置,请用tag标注。
- //两个宝石 相同的点了之后 就都隐藏了 不同 的点了没反应 这是函数的实现
- -(void)pressButton:(UIButton *)btn
- {
- //只被执行一次,以后都不执行了,记录上次的值;如果没有,每次都会执行,避免出现空指针直接nil
- static UIButton * lastBtn=nil;
- if (lastBtn==nil) {
- lastBtn=btn;
- lastBtn.enabled=NO;//点击 是否可以点击
- }
- else
- {
- if (lastBtn.tag==btn.tag) {
- lastBtn.hidden=YES;
- btn.hidden=YES;
- lastBtn=nil;
- }
- else
- {
- lastBtn.enabled=YES;
- lastBtn=nil;
- }
- }
- }
- //横着滚动的情况 特别要注意滚动条的偏移量 横着的画最好与图片的宽度一致,竖着的画最好与图片的宽度一致
- //初始化
- UIScrollView *sv=[[UIScrollView alloc]initWithFrame:CGRectMake(30, 30, 260, 400)];
- //设置滚动条最后移动的背景颜色
- sv.backgroundColor=[UIColor redColor];
- for (int i=0; i<3; i++) {
- UIImageView *imageView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"17_%d.jpg",i+1]]];
- imageView.frame=CGRectMake(0+i*260, 0, 260,400);
- //添加图片视图,视图用addSubview的方法来添加,把图片添加到滚动视图上面
- [sv addSubview:imageView];
- [imageView release];
- }
- //设置显示内容尺寸
- sv.contentSize=CGSizeMake(260*3, 400);
- // 设置按照页码滚动
- sv.pagingEnabled=YES;
- // 设置边缘弹动效果,拉到极端的时候可以弹起来
- sv.bounces=YES;
- //改变滚动条偏移量
- sv.contentOffset=CGPointMake(260, 0);//最好设置为CGPointMake(0, 0);上下 横着都不会首影响
- //再把滚动视图添加到 总试图上面
- [self.view addSubview:sv ];
- //竖着着滚动的情况 特别要注意滚动条的偏移量 横着的画最好与图片的宽度一致,竖着的画最好与图片的宽度一致
- //初始化
- UIScrollView *sv=[[UIScrollView alloc]initWithFrame:CGRectMake(30, 30, 260, 400)];
- //设置滚动条最后移动的背景颜色
- sv.backgroundColor=[UIColor redColor];
- for (int i=0; i<3; i++) {
- UIImageView *imageView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"17_%d.jpg",i+1]]];
- imageView.frame=CGRectMake(0, 0+i*400, 260,400);
- //添加图片视图,视图用addSubview的方法来添加,把图片添加到滚动视图上面
- [sv addSubview:imageView];
- [imageView release];
- }
- //设置显示内容尺寸
- sv.contentSize=CGSizeMake(0, 400*3);
- // 设置按照页码滚动
- sv.pagingEnabled=YES;
- // 设置边缘弹动效果,拉到极端的时候可以弹起来
- sv.bounces=YES;
- //改变滚动条偏移量
- sv.contentOffset=CGPointMake(0, 400);//最好设置为CGPointMake(0, 0);上下 横着都不会首影响
- //再把滚动视图添加到 总试图上面
- [self.view addSubview:sv ];
- //销毁对象,程序结束的时候调用,销毁控制器
- - (void)dealloc
- {
- //棋盘销毁,首先把棋子都拿掉
- self.vc01=nil;
- self.vc02=nil;
- self.vc03=nil;
- self.vc04=nil;
- self.vc05=nil;
- self.vc06=nil;
- [_window release];
- [super dealloc];
- }
- self.navigationItem.leftBarButtonItem=barBtnLef;//导航左按钮
- self.navigationItem.rightBarButtonItem=barBrnRight;//导航右按钮
- //创建左导航按钮
- UIButton *btnLeft=[UIButton buttonWithType:UIButtonTypeCustom];
- btnLeft.frame = CGRectMake(0, 0, 33, 30);
- [btnLeft addTarget:self action:@selector(pressLeftNav) forControlEvents:UIControlEventTouchUpInside];
- UIImage *imageLeft=[UIImage imageNamed:@"main_left_nav"];
- [btnLeft setImage:imageLeft forState:UIControlStateNormal];
- UIBarButtonItem *barBtnLef=[[UIBarButtonItem alloc]
- initWithCustomView:btnLeft];
- self.navigationItem.leftBarButtonItem=barBtnLef;
- //创建右导航按钮,button也有frame 起始位置都是默认的 只需要宽和高就可以了,不一定是添加在window上面,可以添加在视图上面
- UIButton *btnRight = [UIButton buttonWithType:UIButtonTypeCustom];
- btnRight.frame = CGRectMake(0, 0, 48, 29);
- [btnRight addTarget:self action:@selector(pressRightNav) forControlEvents:UIControlEventTouchUpInside];
- UIImage *imageRight = [UIImage imageNamed:@"main_right_nav"];
- [btnRight setImage:imageRight forState:UIControlStateNormal];
- //导航栏 有自己特定的按钮的
- UIBarButtonItem *barBrnRight=[[UIBarButtonItem alloc]initWithCustomView:btnRight];
- self.navigationItem.rightBarButtonItem=barBrnRight;
- navigationItem指的是导航的各种属性 可以引用导航按钮 标题视图 等等
- //导航栏的标题视图titleView
- UIImageView *ivLogo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo_title"]];
- ivLogo.frame = CGRectMake(0, 0, 60, 35);
- self.navigationItem.titleView = ivLogo;//标题视图
- [ivLogo release];
- UIView *bgView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
- UIImageView *bgImageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
- [bgView addSubview:bgImageView];
- imageview.UserInteractionEnabled=YES;//是否能和用户交互;
- //特别注意的一点是 button上面同时有标题与 小图片的时候 默认是图片在前面 ,字在后面
- NSArray *arrayTopButtonTitle = [NSArray arrayWithObjects:@"照片", @"状态", @"报到", nil nil];
- NSArray *arrayTopBtnImages = [NSArray arrayWithObjects:@"rr_pub_takephoto", @"rr_pub_status", @"rr_pub_checkin", nil nil];
- for (int i=0; i<arrayTopButtonTitle.count; i++) {
- UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- btn.frame = CGRectMake(5+105*i, 2, 100, 30);
- [btn setTitle:[arrayTopButtonTitle objectAtIndex:i] forState:UIControlStateNormal];
- //把图片放在按钮上面
- [btn setImage:[UIImage imageNamed:[arrayTopBtnImages objectAtIndex:i]] forState:UIControlStateNormal];
- [topButtonImageView addSubview:btn];
- }
- 经常想做的效果,主界面设置一个好看的图片 让后再添加button 等其他一些东西
- //设置主界面的背景 用图片视图作为背景
- UIView *bgView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
- UIImageView *bgImageView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"rr_main_background"]];
- bgImageView.frame=CGRectMake(0, 0, 320, 460);
- //把图片视图添加到视图 实际上就是把图片添加到视图
- [bgView addSubview:bgImageView];
- //是否可以与用户交互 不能交互就不能够点击按钮
- topButtonImageView.userInteractionEnabled=YES;
- [bgImageView addSubview:topButtonImageView];
- bgImageView.userInteractionEnabled=YES;
- 注意的是:最外层view 设置的button不用设置与用户交互 就是可以点击的 而当视图上面还有小视图的时候 而且小视图上面还有button的时候,这个时候必须设置与用户交互YES
- topButtonImageView.userInteractionEnabled=YES;
- 否则虽然有button 但是点不动 呵呵;
- //张贝贝经典改变颜色的程序
- -(void)viewDidLoad
- {
- [super viewDidLoad];
- self.navigationItem.prompt=@"移动滑块后将改变画面颜色";
- slider =[[UISlider alloc]init];
- slider.frame=self.navigationController.navigationBar.bounds;
- slider.minimumValue=0.0;
- slider.maximumValue=1.0;
- slider.value=0.0;
- [slider addTarget:self action:@selector(sliderDidChange) forControlEvents:UIControlEventTouchUpInside];
- self.navigationItem.titleView=slider;
- label =[[UILabel alloc]init];
- label.frame=CGRectInset(self.view.bounds, 10, 10);
- //表示自动拉伸对齐
- label.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
- label.backgroundColor=[UIColor blackColor];
- [self.view addSubview:label];
- }
- -(void)viewWillAppear:(BOOL)animated
- {
- // [super viewWillAppear:<#animated#>];
- [self.navigationController setNavigationBarHidden:NO animated:YES];
- [self.navigationController setToolbarHidden:YES animated:YES];
- [self.navigationItem setHidesBackButton:YES animated:NO];
- }
- -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- {
- [self.navigationItem setHidesBackButton:NO animated:YES];
- }
- //关于颜色的调配
- -(void)sliderDidChange
- {
- UIColor *color =[[UIColor alloc]initWithRed:(1-slider.value) green:slider.value blue:(1-slider.value)+0.4 alpha:1.0];
- label.backgroundColor=color;
- }
- //static的用法 交替进行
- -(void)changColor
- {
- //保留每一次的值 然后在开始 没有static就每次都是针对 黑色的将不会出现
- //布尔类型的变量 定义了一个变量
- static bool isChange=true;
- if (isChange) {
- self.view.backgroundColor=[UIColor redColor];
- }
- else
- {
- self.view.backgroundColor=[UIColor blackColor];
- }
- //此时必须还要赋过来 然后才可以 红色与黑色交替变换
- isChange=!isChange;
- }
- //通知中心 把方法通过一个控制器传递给另外一个控制器
- [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeBackColor) name:@"CHANGE_COLOR" object:nil];
- 两个控制器都必须有同样的通知 都是同一个方法的实现才是可以的 颜色是可以不一样的
- //滚动条下面的脚视图
- _tableView.tableFooterView = titleView;
- /*
- UITableViewCellAccessoryDetailDisclosureButton为蓝色小园按钮,**可点击**
- */
- 上百个视图的画 大项目 用Single View Application来做做设计 很号的理清自己的思路 视图太多了 不好弄 刚开始尽量不要和代码连接在一起! 拖空间
- 工作的前两年 还是手写代码
- //%2d表示显示两位数字 %02d表示只有各位的时候 十位是0
- NSString *str = [NSString stringWithFormat:@"%02d:%02d",random1,random2];
- //查找的第一响应事件
- - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
- {
- //创建UIControl一层界面
- _searchBg = [[UIControl alloc] initWithFrame:CGRectMake(0, 0, 320, 240)];
- [_searchBg addTarget:self action:@selector(backgroundTap:) forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:_searchBg];
- [_searchBg release];
- return YES;
- }
- - (void)backgroundTap:(id)sender {
- UISearchBar *bar = (UISearchBar *)[self.view viewWithTag:110];
- [bar resignFirstResponder];
- if (_searchBg) {
- [_searchBg removeFromSuperview];
- }
- }
- //一般这种写法是表示自动拉伸对齐
- mTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight;
- 在应用UIBUtton的时候我们有时需要同时设置图片和文字,下面代码仅供参考:
- UIButton *_backButton = [UIButton buttonWithType:UIButtonTypeCustom];
- [_backButton setFrame:CGRectMake(12, 8, 64, 28)];
- [_backButton setTitle:@"返回" forState:UIControlStateNormal]; //设置button在没有选中的时候显示的字体
- _backButton.titleLabel.font = [UIFont systemFontOfSize:14.0f]; //设置button显示字体的大小
- [_backButton setBackgroundImage:[UIImage imageNamed:@"backButton.png"] forState:UIControlStateNormal]; //设置button背景显示图片
- [self.view addSubview:_backButton];
- 出了上面的操作意外,我们还可以同时设置button在选中(按下之后)以及正常状态下(没有选中)显示文字和图片的不同,
- UIButton *_backButton = [UIButton buttonWithType:UIButtonTypeCustom];
- [_backButton setFrame:CGRectMake(12, 8, 64, 28)];
- [_backButton setTitle:@"返回" forState:UIControlStateNormal];
- [_backButton setTitle:@"Down" forState:UIControlStateHighlighted];
- [_backButton setBackgroundColor:[UIColor clearColor]];
- [_backButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
- _backButton.titleLabel.font = [UIFont systemFontOfSize:14.0f];
- [_backButton setBackgroundImage:[UIImage imageNamed:@"backButton.png"] forState:UIControlStateNormal];
- [_backButton setBackgroundImage:[UIImage imageNamed:@"DownButton.png"] forState:UIControlStateNormal];
- [_toolBar addSubview:_backButton];
- //自定义导航条添加按钮,并且添加事件
- UIBarButtonItem *btn=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStyleBordered target:self action:@selector(btns:)];
- //放在左边
- self.navigationItem.leftBarButtonItem=btn;
- 不管有多少行 都是可以用来代替的。。。。
- //一般试图器之间发生的关系 都是用一个button 点击事件 然后用导航推出下一个视图
- -(void)nextPage:(id)sender
- {
- //创建下一个视图控制器的对象
- thirdViewController *third = [[thirdViewController alloc]init];
- //然后用导航来推出
- [self.navigationController pushViewController:third animated:YES];
- [third release];
- }
- 同步声明一次 就应该析构一次
- @property (strong, nonatomic) UISplitViewController *splitViewController;
- @synthesize splitViewController = _splitViewController;
- 这是必须的 因为声明一次 就会出现一个strong 计数器加上1 就需要释放一次
- - (void)dealloc
- {
- [_splitViewController release];
- [super dealloc];
- }
- //需要牢记的内存管理知识
- @property (nonatomic, copy) NSString *descrition;//字符串的声明,里面最好是用copy
- //同步的标准写法 加上下划线
- @synthesize descrition = _descrition;
- //立马还需要调用dealoc函数 析构 自己手动写出 高手的指点
- - (void)dealloc
- {
- self.descrition = nil;
- [super dealloc];
- }
- 另外需要注意的是
- @property (assign, nonatomic) NSInteger i;//assign是弱引用,计数器不用加1
- 而且整形的变量是不需要分配内存空间的 没有指针 所以不能给强引用 ,此时不能用到strong的
- //本类中声明成员变量的方法 只是为了本类来使用的 其他的类是用不着的
- @implementation Vc02
- {
- //只允许本类来使用的成员变量
- NSDictionary *_dict;
- }
- //成员变量只要是指针变量 就需要调用dealloc来释放 顺序是先release 然后再放空 声明的全局变量需要 self.descrition = nil; 直接放空 就可以了 需要特别的牢记
- - (void)dealloc
- {
- //成员变量是先释放 然后在放空
- [_dict release];
- _dict = nil;
- [super dealloc];
- }
- //设置内容尺寸,能够显示内容的尺寸 根据所有图片的大小来确定的
- sv03.contentSize=CGSizeMake(0, 1000);
- // 设置按照页码滚动
- sv03.pagingEnabled=YES;
- // 设置边缘弹动效果,拉到极端的时候可以弹起来
- sv03.bounces=YES;
- //改变滚动条偏移量,从第三张图片开始 ,从顶部第一张图片开始的,就是0与0,这个偏移量挺重要的
- sv03.contentOffset=CGPointMake(0, 320);
- //再把滚动视图添加到 总试图上面
- [self.view addSubview:sv03 ];
- [sv03 release];
- //添加右边的图片
- UIImageView *imageView01=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"衣装"]];
- imageView01.frame=CGRectMake(170, 0, 150, 75);
- imageView01.userInteractionEnabled =YES;
- UIButton *button01=[UIButton buttonWithType:UIButtonTypeCustom];
- button01.frame=CGRectMake(0, 0, 150, 75);
- [button01 addTarget:self action:@selector(press01) forControlEvents:UIControlEventTouchUpInside];
- //加一个nil 表示透明的button 与下面一句话的意思差不多
- //[button setImage:nil forState:UIControlStateNormal];
- [button01 setBackgroundColor:[UIColor clearColor]];
- [imageView01 addSubview:button01];
- [self.view addSubview:imageView01];
- [imageView01 release];
- UIAlertView 是不用添加到试图上面 的
- 但是UIActionSheet 是必须要添加到试图上面
- 全局的成员变量 需要用dealloc函数来释放的 记住;
- @property(strong,nonatomic)UILabel *lab01;
- @synthesize lab01;
- self.lab01=[[[UILable alloc]init]autorelease];//这里用到了点语法,所以计数器是加1的;后面需要一个自动释放池才可以,程序快结束的时候来调用,用点语法才是正常调用了@property与@synthesize 要不然只是声明。。。。全局的成员变量还要用到dealloc来析构一次才可以
- 一般不建议这样用 ,最好还是用[lab01 release];
- //UIActionSheet是最外层的 所以一般不能直接添加到试图view上面 记住!!
- UIImageView *imageview = (UIImageView *)[self.view viewWithTag:33333];
- actionsheet=[[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"分享到新浪微博" otherButtonTitles:@"分享到腾讯微博", nil nil];
- actionsheet.delegate=self;
- [actionsheet showInView:imageview];
- [actionsheet release];
- //滚动试图在下面 点哪张 加上哪张
- -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- {
- UITouch *touch=[touches anyObject];
- //鼠标点击的位置 确定下来
- CGPoint pt=[touch locationInView:scroll02];
- //点击一次的时候
- if (touch.tapCount==1) {
- for (int i=0; i<18; i++) {
- //根据tag 找到那个图片视图
- UIImageView *image=(UIImageView *)[scroll02 viewWithTag:i+1];
- //设置与用户交互
- image.userInteractionEnabled=YES;
- //
- // int tag=image.tag;
- scroll02.userInteractionEnabled=YES;
- //判断是否点击到了图片
- if (CGRectContainsPoint(image.frame, pt)) {
- //点到了哪张 就把图片的文件名赋给他
- imageName=[NSString stringWithFormat:@"17_%d.jpg",image.tag];
- UIImage *image=[UIImage imageNamed:imageName];
- UIImageView *imageView=[[UIImageView alloc]initWithImage:image];
- imageView.frame=CGRectMake(0, 0, 320, 190);
- [self.view addSubview:imageView];
- [imageView release];
- }
- }
- }
- }
- UITouch
- 处理用户响应事件,需要重载那三个触摸的方法,开始,触摸到,末尾,
- //用下载的数据 实例化 xml解析器
- GDataXMLDocument *doc=[[GDataXMLDocument alloc]initWithData:downloadData
- options:0 error:nil];
- //解析器 创建成功 (下载的数据 是合法的xml文件)
- if (doc) {
- //从解析器中用xpath 语法 查找 我要找的节点 返回值不管怎么样 都是数组类型
- NSArray *usersArray=[doc nodesForXPath:@"//user" error:nil];
- //xml文档中 的所有的 节点 都是 GDataXMLElement类的 实例(对象)
- for (GDataXMLDocument *element in usersArray) {
- // [element childAtIndex: ];//返回的第几个子节点
- // [element childCount];
- //返回element 节点的子节点 为数组
- //[element children];
- // [element attributeForName:@""]; 获得element 节点的指定名称 的属性 节点
- //获得element节点的所以的属性节点
- // [element attribute];
- //实例化 模型类 对象
- UserItem *item=[[[UserItem alloc]init] autorelease];
- //从当前节点中查找 指定名称的子节点 elementsForName 所有的节点 都是element
- // NSArray *subArray=[element elementsForName:@"uid"];
- // //uid节点
- //
- // GDataXMLElement *uidElement=[subArray lastObject];
- //
- // //获取节点的 文本信息
- // item.uid=[uidElement stringValue];
- item.uid=[self elementString:element name:@"uid"];
- item.username=[self elementString:element name:@"username"];
- item.realname=[self elementString:element name:@"realname"];
- item.headimage=[NSString stringWithFormat:@"http://192.168.88.8/sns%@",[self elementString:element name:@"headimage"]] ;
- [dataArray addObject:item];
- }
- isLoading=NO;
- [self.tableView reloadData];
- }
- 高亮情况下的button的实现方式(相当于设置两张图片,一张是为默认准备的,一张是高亮准备的)
- //默认的情况是出现一张图片
- UIButton * rightbtn = [UIButton buttonWithType:UIButtonTypeCustom];
- [rightbtn setImage:[UIImage imageNamed:@"NextMenuButton.png"] forState:UIControlStateNormal];
- //高亮的时候是出现另外一张图片
- [rightbtn setImage:[UIImage imageNamed:@"NextMenuButtonSelected.png"] forState:UIControlStateHighlighted];
- rightbtn.frame = CGRectMake(200, 0, 40, 40);
- [rightbtn addTarget:self action:@selector(pressrightbtn) forControlEvents:UIControlEventTouchUpInside];
- [navbar addSubview:leftbtn];
- [navbar addSubview:rightbtn];
- 自定义导航栏以及导航栏上面的 按钮 的基本方法
- //自己定义导航栏
- UINavigationBar * navbar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
- //导航栏设置背景图片
- [navbar setBackgroundImage:[UIImage imageNamed:@"NavigatorBarBg"] forBarMetrics:UIBarMetricsDefault];
- //创建这个对象很重要的
- UINavigationItem * item =[[UINavigationItem alloc] init];
- //导航栏上面的返回按钮
- UIBarButtonItem * btn1 = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:self action:@selector(pressbtn1)];
- btn1.tintColor = [UIColor yellowColor];
- item.leftBarButtonItem = btn1;
- [btn1 release];
- //没有这句话 回来的时候就推不过去的
- [navbar pushNavigationItem:item animated:YES];
- [item release];
- [self.view addSubview:navbar];
- [navbar release];
- //这么重要的函数老师居然没有讲 我靠!!
- //此函数 如果是 return YES则就是四个方向都是支持的 竖着,倒着,左横,右横; 但系统默认只是正着的状态
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
- {
- // Return YES for supported orientations
- return (interfaceOrientation == UIInterfaceOrientationPortrait);
- // return YES;
- }
ios 学习笔记<二> 【经典】
最新推荐文章于 2024-11-03 21:54:35 发布