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]; } }
浙公网安备 33010602011771号