ios项目1结束总结

ios项目 学习总结

主要是一个图片展示的项目,现在才发现,项目前期的规划很重要,本文记录下项目开发中遇到的问题,

1 动画的实现,在界面内到处飘荡的蒲公英,简单的使用了uiview的动画和时间函数NStimer实现的,代码大致如下:

复制代码
      puGongYingTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(runPuGongYing) userInfo:nil repeats:NO];//时间函数
bigPuGongYingGif =[[GifView alloc] initWithFrame:CGRectMake(-20, 50, 45,46) filePath:[[NSBundle mainBundle] pathForResource:@"pugongying" ofType:@"png"]];
//上面的是GIf图片的实现开始的动画实现       
    [bgView addSubview:bigPuGongYingGif]; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDelegate:self]; [UIView setAnimationDuration:
50]; int startX = round(random() % 900);//随机的路径 int endX = round(random() % 700); NSLog(@"startX===%d endX===%d",startX,endX); bigPuGongYingGif.frame=CGRectMake(1025, endX, 45, 46); [UIView setAnimationDidStopSelector:@selector(runPuGongYingAgain)];//循环调用 [UIView commitAnimations];
  
复制代码

2 在appdelegate里面页面的跳转方法,先设置为空,然后设置为需要的VC

   self.window.rootViewController=Nil;、、
        PingBao_PageViewController *pic_page=[[PingBao_PageViewController alloc]init];
        self.window.rootViewController=pic_page;

3 app不让自动锁屏幕 [UIApplication sharedApplication].idleTimerDisabled=YES;
4单例模式的使用非常有用,下面给一个例子,方面以后使用

复制代码
#import <Foundation/Foundation.h>

@interface DataPist : NSObject{
    NSMutableDictionary *arryData;
}
@property(nonatomic,strong)NSMutableDictionary *arryData;
@property(nonatomic,strong)NSArray *jianBaoArry;
@property(nonatomic,strong)NSString *ipString;

+(DataPist *) shared;
+(id) allocWithZone:(NSZone *)zone;
+(NSData*)stringToByte:(NSString*)string;
+(void)showLoading;
+(void)hideLoading;
+ (NSString *)dataFilePath ;
@end

#import "DataPist.h"

@implementation DataPist
@synthesize arryData,jianBaoArry,ipString;
static DataPist *ShareDataPist = nil;

+(DataPist *) shared{
    
    @synchronized(self)
    {
        if (ShareDataPist == nil)
        {
            ShareDataPist = [[self alloc] init] ;
            
        }
    }
    return ShareDataPist;
}

+(id) allocWithZone:(NSZone *)zone
{
    @synchronized(self)
    {
        if (ShareDataPist == nil)
        {
            ShareDataPist = [super allocWithZone:zone];            
            return ShareDataPist;
        }
    }  
    return nil;
}

//转码函数16进止的图片转换的NSData
+(NSData*)stringToByte:(NSString*)string
{
    NSString *hexString=[[string uppercaseString] stringByReplacingOccurrencesOfString:@" " withString:@""];
    if ([hexString length]%2!=0) {
        return nil;
    }
    Byte tempbyt[1]={0};
    NSMutableData* bytes=[NSMutableData data];
    for(int i=0;i<[hexString length];i++)
    {
        unichar hex_char1 = [hexString characterAtIndex:i]; ////两位16进制数中的第一位(高位*16)
        int int_ch1;
        if(hex_char1 >= '0' && hex_char1 <='9')
            int_ch1 = (hex_char1-48)*16;   //// 0 的Ascll - 48
        else if(hex_char1 >= 'A' && hex_char1 <='F')
            int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65
        else
            return nil;
        i++;
        
        unichar hex_char2 = [hexString characterAtIndex:i]; ///两位16进制数中的第二位(低位)
        int int_ch2;
        if(hex_char2 >= '0' && hex_char2 <='9')
            int_ch2 = (hex_char2-48); //// 0 的Ascll - 48
        else if(hex_char2 >= 'A' && hex_char2 <='F')
            int_ch2 = hex_char2-55; //// A 的Ascll - 65
        else
            return nil;
        
        tempbyt[0] = int_ch1+int_ch2;  ///将转化后的数放入Byte数组里
        [bytes appendBytes:tempbyt length:1];
    }
    return bytes;
}
+(void)showLoading{
//    [[UIApplication sharedApplication].windows objectAtIndex:0]
    
       [MBProgressHUD showHUDAddedTo:[[UIApplication sharedApplication].windows objectAtIndex:0] animated:YES];
//    mb.labelText=@"正在加载";
}
+(void)hideLoading{
    [MBProgressHUD hideHUDForView:[[UIApplication sharedApplication].windows objectAtIndex:0] animated:YES];

}
+ (NSString *)dataFilePath {
    //写入library
    NSString *path=[NSHomeDirectory() stringByAppendingPathComponent:@"Library"];
    
    NSString *pathNext = [NSString stringWithFormat:@"%@/Caches",path];
    NSString *fileNamepath=[pathNext stringByAppendingPathComponent:@"Image.plist"];
    return fileNamepath;
}
@end
复制代码

5  下载多个zip文件图片,然后解压,放入指定的目录,实现

下载实现:

复制代码
 //宏定义沙盒目录#define DocumentsDirectory [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject]
-(void)download{
    mb.labelText=@"正在下载";
    // 初始化队列
    if (!networkQueue) {
        networkQueue = [[ASINetworkQueue alloc] init];
        // 设置最大并发数 默认为-1 无限制
        [networkQueue setMaxConcurrentOperationCount:-1];
    }
    // 重制队列
    [networkQueue cancelAllOperations];
    [networkQueue reset];
    // 设置队列的进度条
    [networkQueue setDownloadProgressDelegate:progressView];
    // 设置完成方法
    [networkQueue setRequestDidFailSelector:@selector(Failed:)];//一个文件下载失败执行
    [networkQueue setQueueDidFinishSelector:@selector(Succeed:)];//不管下载成功失败都会执行的
    [networkQueue setRequestDidFinishSelector:@selector(Finished:)];//一个成功就执行
    // 显示精确进度
    [networkQueue setShowAccurateProgress:YES];
    [networkQueue setDelegate:self];
    ASIHTTPRequest *request;
    //zip_names从服务器去的zipname地址
    for (int i=0; i<[zip_names count]; i++) {
        NSString *name=[zip_names objectAtIndex:i];
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/api/%@.zip",[DataPist shared].ipString,name]];
        request = [ASIHTTPRequest requestWithURL:url];
     [request setTemporaryFileDownloadPath:[DocumentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.zip.temp",[zip_names objectAtIndex:i]]]]; [request setDownloadDestinationPath:[DocumentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:
@"%@.zip",[zip_names objectAtIndex:i]]]]; [request setAllowResumeForFileDownloads:YES]; [networkQueue addOperation:request]; } [networkQueue go]; } -(void)Succeed:(ASINetworkQueue *)request{ if (Flag != NO) { [self performSelector:@selector(changeloading) withObject:self afterDelay:0]; [self jieya]; } } -(void)Finished:(ASIHTTPRequest *)request{ } -(void)changeloading{ mb.labelText=@"正在初始化数据"; } -(void)Failed:(ASIHTTPRequest *)request{ Flag = NO;//一个文件下载失败的时候设置为no,将不会执行Succeed:(ASINetworkQueue *)request里面的解压方法 if (IsFail==NO) { [ MBProgressHUD hideHUDForView:self.view animated:YES]; UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"网络更新失败,请重新下载" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:Nil, nil]; [alert show]; IsFail=YES;变成yes后,他就只执行一次, } progressView.hidden=YES; [ MBProgressHUD hideHUDForView:self.view animated:YES]; }
//IsFail=NO下载失败,为了不让重复出现下载失败的弹出框;
//Flag = YES;作用是显示只有下载成功后才开始执行 Succeed:(ASINetworkQueue *)request里面的方法,这是他们的初始化值,
//当失败后,又的从新开始他们的数据初始化,IsFail=no,Flag=yes
//解压方法
- (void)jieya{
   要用到zipArchive的类库
    ZipArchive *zip=[[ZipArchive alloc]init];
    for (int i = 0; i < zip_names.count; i++) {
        NSString *name = [NSString stringWithFormat:@"Documents/%@.zip",[zip_names objectAtIndex:i]];
        NSString *path=[NSHomeDirectory()stringByAppendingPathComponent:[NSString stringWithString:name]];
           NSLog(@"-----%@",path);
        
        NSString *unZipTo;
        NSString *rang=[zip_names objectAtIndex:i];
     // 这块是为了找到下载的zip是那种,然后分开设置放到不同的文件夹里,
        if (([rang rangeOfString:@"large"].location!=NSNotFound)) {
            
            unZipTo = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/bigImage"];
        }else{
            
            unZipTo = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
        }
        
        if ([zip UnzipOpenFile:path])
        {
            [zip UnzipFileTo:unZipTo overWrite:YES];
            [zip UnzipCloseFile];
        }
    }

    if ([[zip_names objectAtIndex:0] rangeOfString:@"small"].location!=NSNotFound||[[zip_names objectAtIndex:0] rangeOfString:@"publicimg"].location!=NSNotFound) {
        [self writer];
    }else{
      NSLog(@"大图不需要写入");
 
}

6:ipad上面的弹出视图:用下面这周方式,类似qq弹出设置界面的

 Setting_PageViewController *setting_page = [[Setting_PageViewController alloc]init];
    UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:setting_page];
    nav.modalPresentationStyle=UIModalPresentationFormSheet;
    [self presentViewController:nav animated:YES completion:NULL];

如果弹出界面有多层的视图,可以使用这样push进去的,(用的是tableView的方法)

复制代码
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    if (indexPath.section==0) {
        switch (indexPath.row) {
            case 0:
            {
                ScreenSaveAnimation_ViewController *SV=[[ScreenSaveAnimation_ViewController alloc]init];
                [self.navigationController pushViewController:SV animated:YES];
            }
                break;
            case 1:{
                ScreenSaveType_ViewController *ST=[[ScreenSaveType_ViewController alloc]init];
                [self.navigationController pushViewController:ST animated:YES];
                
            }break;
                
            default:
                break;
        }
复制代码

push进去的视图,返回的时候也可以返回 [self.navigationController popViewControllerAnimated:YES]

下面的方法主要显示的在scrollview上面当加载到下一页的时候,当你放回的时候不用再加载
复制代码
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
  int  n=scrollView.contentOffset.x/1024;
    if (n >= scor) {
        scor = n;
        [self initImage:n];
    }
}
复制代码

用scrollview显示多张 图片,类似于图片浏览器

复制代码
  scroll=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 82, 1024, 630)];
    scroll.backgroundColor=[UIColor clearColor];
    scroll.showsVerticalScrollIndicator=NO;
    scroll.pagingEnabled=YES;
    scroll.delegate=self;
    scroll.showsVerticalScrollIndicator = FALSE;
    scroll.showsHorizontalScrollIndicator = FALSE;
    [self.view addSubview:scroll];底层的scrollview用于滑动和分页用的
  
//这MRZoomScrollView主要用与显示图片和放大图片的
for (int i = 0; i < imageArrys.count; i++) { zoomScrollView = [[MRZoomScrollView alloc]init]; CGRect frame = scroll.frame; zoomScrollView.maximumZoomScale=2; zoomScrollView.minimumZoomScale=1; zoomScrollView.tag=2000+i; zoomScrollView.showsVerticalScrollIndicator = NO; zoomScrollView.showsHorizontalScrollIndicator=NO; // zoomScrollView.backgroundColor=[UIColor grayColor]; frame.origin.x = frame.size.width * i; frame.origin.y = 0; zoomScrollView.frame = frame; [scroll addSubview:zoomScrollView]; } scroll.contentSize=CGSizeMake(1024*imageArrys.count, 768);设置图片共有多少张 [scroll setContentOffset:CGPointMake(1024*currentNum, 0) animated:YES];//设置点击小图进入大图的时候scroll停留在那个位置。

MRZoomScrollView自定义的类显示图片的scrollview
@interface MRZoomScrollView : UIScrollView <UIScrollViewDelegate>
{
    UIImageView *imageView;
}

@property (nonatomic, retain) UIImageView *imageView;


@end

#import "MRZoomScrollView.h"

#define MRScreenWidth      CGRectGetWidth([UIScreen mainScreen].applicationFrame)
#define MRScreenHeight     CGRectGetHeight([UIScreen mainScreen].applicationFrame)

@interface MRZoomScrollView (Utility)

- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center;

@end

@implementation MRZoomScrollView

@synthesize imageView;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        
        self.delegate = self;
        self.frame = CGRectMake(0, 0, MRScreenWidth, MRScreenHeight);
        
        [self initImageView];
    }
    return self;
}

- (void)initImageView
{
    imageView = [[UIImageView alloc]init];
    
    // The imageView can be zoomed largest size
    imageView.frame = CGRectMake(224, 0, 576, 768);
    imageView.userInteractionEnabled = YES;
    [self addSubview:imageView];
   }

#pragma mark - Zoom methods

- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
    NSLog(@"------%@",NSStringFromCGSize(scrollView.contentSize));

    CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width)?
    (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0.0;
    CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height)?
    (scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5 : 0.0;
    //    if (YES) {
    imageView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX,
                               scrollView.contentSize.height * 0.5 + offsetY);

}

#pragma mark - UIScrollViewDelegate

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return imageView;
}

#pragma mark - View cycle

@end

主要用于显示党scrollview滑动超过一屏时才执行的方法,
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    if (scrollView.contentOffset.x>1024*n||scrollView.contentOffset.x<=1024*(n-1)) {//判断是否滑动一屏
        n=scrollView.contentOffset.x/1024;
        [self initImage:n];
    }
}
复制代码

苹果自带的简单的网络请求方法 并且解析数据

复制代码
-(void)getInfoImage{
    NSString *urlString = [NSString stringWithFormat:@"%@/api/model_style.php?img_name=%@",[DataPist shared].ipString,[imageArrys objectAtIndex:tags]];
    
    NSURLResponse *urlResponce=nil;
    NSError *error=nil;
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    NSData *Data=[NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponce error:&error];
    if (error) {
        [DataPist hideLoading];
        UIAlertView *alter=[[UIAlertView alloc]initWithTitle:@"提示" message:@"当前网络不可用,请稍后再试" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        [alter show];
        return;
    }
    
    NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:Data options:NSJSONReadingMutableLeaves error:nil];
复制代码

还有当滑动的时候清除一些控件的值,为了防止重叠,让他从新显示,如果用viewwithtag比较麻烦的话,可以使用简单的把需要从新赋值的控件放到一个view上面,然后通过移出view,新建view从新赋值,

8:如果客户端需要查询图片分类的方法。一般的情况是需要数据库的支持,但是为了方便的话,可以点击按钮,像服务器短发请求,通过服务器查询后返回需要的图片的显示,然后客户端接受图片,然后在沙盒里面查询,这样还快,比较简单,显示沙盒里面的图片的简单的方法如下

复制代码
  NSString *name=[NSString stringWithFormat:@"%@",[imageArrys objectAtIndex:tags]];图片名
    NSString *ss=[NSString stringWithFormat:@"Documents/bigImage/%@",name];
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@",ss]];图片路径
    NSString *fileName=[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];/加载图片,转为字符串
    NSString *imageNames=[fileName stringByReplacingOccurrencesOfString:@"-" withString:@"1"];//解密加密的图片字符串
复制代码

9 视频的加载用到的是AVQueuePlayer,简单的代码如下

复制代码
//初始化播放器组件
-(void)initPlayer
{
    [arryItems removeAllObjects];
    
    for (int i = 0; i < 34; i++) {
        [arryMp3Name addObject:[NSString stringWithFormat:@"序列 %@",[arryImages objectAtIndex:i]]];
    }    for (NSString *text in arryMp3Name) {
        NSURL *playerFileURL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:text ofType:@"mp4"]];
        AVPlayerItem *item=[AVPlayerItem playerItemWithURL:playerFileURL];
        [arryItems  addObject:item];
    }
//    NSLog(@"arryItems==%d",arryItems.count);
    //添加播放下首歌的通知
    for (int songPointer = 0; songPointer < [arryItems count]; songPointer++) {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(songEnded:)
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:[arryItems objectAtIndex:songPointer]];
    }
    
    queuePlayer = [AVQueuePlayer queuePlayerWithItems:arryItems];
    playLayer = [AVPlayerLayer playerLayerWithPlayer:queuePlayer];
    playLayer.frame = CGRectMake(0, 82, 1024, 576);
    [self.view.layer addSublayer:playLayer];
    [queuePlayer play];
    
    playerView=[[UIView alloc]initWithFrame:CGRectMake(0,90, 1024, 576)];
    playerView.backgroundColor=[UIColor clearColor];
    playerView.userInteractionEnabled=YES;
    [self.view addSubview:playerView];
    
}
-(void)songEnded:(NSNotification *)notification{
//    NSLog(@"---%@",notification.object);
//    NSLog(@"--%d",n);
//    NSLog(@"-----------------------%d",littletag);
    if (Flag == YES) {
        n = littletag;
        Flag = NO;
    }
    //动画实现添加蒙板
    [UIView beginAnimations:@"Curl"context:nil];//动画开始
    [UIView setAnimationDuration:0.75];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
    [(UIButton *)[self.view viewWithTag:n+1+1000] setAlpha:1];//主要是视频下面的饿缩略图的显示随着视频的播放显示
    [(UIButton *)[self.view viewWithTag:n+1000] setAlpha:0.2];
    [UIView commitAnimations];
    
    n++;
    //当n=34,播放到最后一个的时候,重新初始化播放器
    if (n==34) {
        n=0;
        [(UIButton *)[self.view viewWithTag:n+1000] setAlpha:1];
        [self initPlayer];
         [scoll setContentOffset:CGPointMake(0,scoll.contentOffset.y) animated:YES];
    }
    if(n>=10&&n<27){
        [scoll setContentOffset:CGPointMake(scoll.contentOffset.x+90,scoll.contentOffset.y) animated:YES];
    }
    
}
//返回到别的页面,要注销所有通知
//当返回上级时移除所有通知
- (void)releaseQueuePlayer
{
    n=0;
    for (int songPointer = 0; songPointer < [arryItems count]; songPointer++) {
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:[arryItems objectAtIndex:songPointer]];
    }
     
    [queuePlayer removeAllItems];
    [arryItems removeAllObjects];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"startMovie" object:nil];
    [queuePlayer pause];   
}
、、点击下面某个缩略图,播放某个视频,然后接着下面的后面的继续播放
//返回到到播放页面的方法
-(void)replayMovie:(NSNotification *)tag
{
//    NSLog(@"----%@",tag.object);
    [queuePlayer removeAllItems];
//    NSLog(@"***************%d",[tag.object intValue]);
    littletag=[tag.object intValue];
    for (int i = littletag; i <arryItems.count; i++) {
        AVPlayerItem* obj = [arryItems objectAtIndex:i];
        if ([queuePlayer canInsertItem:obj afterItem:nil]) {
            [obj seekToTime:kCMTimeZero];
            [queuePlayer insertItem:obj afterItem:nil];
        }
    }
    for (int i=0; i<34; i++) {
        [(UIButton *)[self.view viewWithTag:1000+i]setAlpha:0.2];
    }
    [(UIButton *)[self.view viewWithTag:littletag+1000]setAlpha:1];
    [queuePlayer play];
//    if(littletag>=10){
//        [scoll setContentOffset:CGPointMake(scoll.contentOffset.x+90,scoll.contentOffset.y) animated:YES];
//    }
}

复制代码

上面就是项目中学到的东西,希望以后能注意,铭记

你可能感兴趣的:(ios项目1结束总结)