STEP 1:通过UIImagePickerController类来拍摄照片(其实该类是用来获取图片)。需要用setSourceType设置图片的获取来源:来自相机、本地相册、或其他。presentViewController:animated:completion:用来显示出UIImagePickerController对象。

    UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
    }else{
        [imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    }
    
    [imagePicker setDelegate:self];
    
    [self presentViewController:imagePicker animated:YES completion:nil]; //拍摄时采用全屏模式?

STEP 2:用imagePickerController:didFinishPickingMediaWithInfo:把选中的图片(或拍摄的图片)在imageView框中显示出来。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

UIImage *im = [info objectForKey:UIImagePickerControllerOriginalImage]; [imageView setImage:im]; [self dismissViewControllerAnimated:YES completion:nil]; }

STEP 3:虽然可以如STEP2中用setImage把拍到的图片在imageView中显示出来,但是为了防止闪退,最好还是给拍到的im创建一个单独的存储。因此在STEP 2中的方法里添加如下代码:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    
    //先检查下是否依旧有照片了,如果依旧有了,就删掉。
    NSString *oldKey = [bnritem imageKey];
    if (oldKey) {
        [[ImageStore sharedStore]deleteImageForKey:oldKey];
    }
    
    
    UIImage *im = [info objectForKey:UIImagePickerControllerOriginalImage];
    

   //生成一个随机不重复的Key(I)(II),并赋给拍到的这个照片(III),然后把这个照片存到ImageStore中(IV)

    CFUUIDRef newUniqueID = CFUUIDCreate(kCFAllocatorDefault);//创建CFUUIDRef对象,该对象知道如何创建无重复字符串,其实就是个随机不重复数字 (I)

    CFStringRef newUniqueIDString = CFUUIDCreateString(kCFAllocatorDefault, newUniqueID);//把刚才的CFUUIDRef对象变成一个字符串 (I)

   [bnritem setImageKey:(NSString *)newUniqueIDString];//将字符串赋给imagekey。里面用了一个无损桥连(类似一种强制类型转换)(NSString *) (III)

   [[ImageStore sharedStore] setImage:im forKey:[bnritem imageKey]];//把照片放到照片数组imagestore中 (IV)

   //当指向Objective-c对象的变量被销毁时,ARC会知道这个对象失去了一个所有者。但是ARC不对CORE FUNDATION对象做这些事。所以要再Core Fundation对象失去指针之前,先手工调用CFRelease,否则该对象依旧会认为自己有这个“拥有者”,然后就会发生内存泄露

   CFRelease(newUniqueIDString);

   CFRelease(newUniqueID);

   [imageView setImage:im];

   [self dismissViewControllerAnimated:YES completion:nil];

}

STEP 4:为了让每次打开页面时都能显示照片,要在viewWillAppear:中进行要求。

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    
    [nameField setText:[bnritem itemName]];
    [serialNumberField setText:[bnritem serialNumber]];
    [valueField setText:[NSString stringWithFormat:@"%d", [bnritem valueInDollars]]];
     
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
     [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
     [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
     
     [dateLabel setText:[dateFormatter stringFromDate:[bnritem dateCreated]]];
    
    [[self navigationItem] setTitle:[bnritem itemName]];
    
    
    NSString *imagekey = [bnritem imageKey];
    if (imagekey) {
        UIImage *imageToDisplay = [[ImageStore sharedStore]imageForKey:imagekey];//从ImageStore中取出对应于imageKey的照片,然后在imageView中显示出来
        [imageView setImage:imageToDisplay];
    }else{
        [imageView setImage:nil];
    }
}

 

 

posted on 2014-02-15 10:42  zhoudi  阅读(368)  评论(0)    收藏  举报