这个示例程序主要用到了IOS中的UIImageView、UIImagePickerViewController、UIImage、NSFileManager等知识,结合这些知识构成一个小的应用程序,主要功能是对相册图片进行读取、存储到指定文件夹、从指定文件夹读取出来。这方面的知识在正式项目中用的是比较多的。做Android开发中,经常会使用到将图片保存到SD卡和从SD卡读取图片的操作,相比于Android在这方面的操作,IOS要方便许多。
基本功能是从相册选取一张图片,选完后显示在界面的UIImageView控件中,点击保存到文件夹按钮后就将图片保存到Documents下的ImageFile文件夹中,以image.png命名。退出程序下次进来时,可以选择从文件夹读取图片,如果有则读取出来显示在UIImageView上,如果没有则提示文件不存在。
首先来看看最后效果:
·从相册选取图片后显示在界面上
这里对功能进行了一点改进,点击打开相册按钮后出来一个UIActionSheet操作选项框,可以选择是从相机获取图片还是从相册获取。代码也做出了一点修改。
·点击保存到文件夹按钮后提示信息
·点击读取图片按钮后的提示信息(图片不存在)
·如果存在则将图片显示出来
保存图片成功后,按照前一篇文章提到的方法,可以到Finder下查看文件信息:
下面是实现部分,首先看看布局文件:
下面是代码:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIActionSheetDelegate>
@property (retain, nonatomic) IBOutlet UIImageView *imageView;
@property (retain, nonatomic) UIButton *saveToFileButton;
//打开相册
- (IBAction)openAlbum:(id)sender;
//从文件夹读取图片
- (IBAction)readImage:(id)sender;
@end
下面是ViewController.m文件
#import "ViewController.h"
//保存到文件夹按钮的标签,选取图片前,这个按钮是隐藏的
#define SAVE_BUTTON_TAG 101
@interface ViewController ()
@end
@implementation ViewController
@synthesize imageView = _imageView;
@synthesize saveToFileButton = _saveToFileButton;
- (void)viewDidLoad
{
[super viewDidLoad];
//根据设置的tag获取按钮控件
self.saveToFileButton = (UIButton *)[self.view viewWithTag:SAVE_BUTTON_TAG];
//添加对象事件
[self.saveToFileButton addTarget:self action:@selector(saveToFileBtnTapped:) forControlEvents:UIControlEventTouchUpInside];
//设置为不可见
self.saveToFileButton.hidden = YES;
}
- (void)viewDidUnload
{
[self setImageView:nil];
[self setSaveToFileButton:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
- (void)dealloc {
[self.imageView release];
[self.saveToFileButton release];
[super dealloc];
}
- (IBAction)openAlbum:(id)sender {
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"选择图片" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照",@"相册", nil];
[actionSheet showInView:self.view];
[actionSheet release];
}
//从文件夹读取图片
- (IBAction)readImage:(id)sender {
NSString *imagePath = [self imageSavedPath:@"image.png"];
NSFileManager *fileManager = [NSFileManager defaultManager];
//判断文件是否存在
if (![fileManager fileExistsAtPath:imagePath]) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Note" message:@"文件不存在" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alertView show];
[alertView release];
}else {
//从指定目录读取图片
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
self.imageView.image = image;
}
}
//保存到文件按钮事件
- (void)saveToFileBtnTapped:(id)sender {
NSString *imagePath = [self imageSavedPath:@"image.png"];
BOOL isSaveSuccess = [self saveToDocument:self.imageView.image withFilePath:imagePath];
if (isSaveSuccess) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"操作结果" message:@"保存图片成功" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alertView show];
[alertView release];
}else {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"操作结果" message:@"保存图片失败" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alertView show];
[alertView release];
}
}
//将选取的图片保存到目录文件夹下
-(BOOL)saveToDocument:(UIImage *) image withFilePath:(NSString *) filePath
{
if ((image == nil) || (filePath == nil) || [filePath isEqualToString:@""]) {
return NO;
}
@try {
NSData *imageData = nil;
//获取文件扩展名
NSString *extention = [filePath pathExtension];
if ([extention isEqualToString:@"png"]) {
//返回PNG格式的图片数据
imageData = UIImagePNGRepresentation(image);
}else{
//返回JPG格式的图片数据,第二个参数为压缩质量:0:best 1:lost
imageData = UIImageJPEGRepresentation(image, 0);
}
if (imageData == nil || [imageData length] <= 0) {
return NO;
}
//将图片写入指定路径
[imageData writeToFile:filePath atomically:YES];
return YES;
}
@catch (NSException *exception) {
NSLog(@"保存图片失败");
}
return NO;
}
//根据图片名将图片保存到ImageFile文件夹中
-(NSString *)imageSavedPath:(NSString *) imageName
{
//获取Documents文件夹目录
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [path objectAtIndex:0];
//获取文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
//指定新建文件夹路径
NSString *imageDocPath = [documentPath stringByAppendingPathComponent:@"ImageFile"];
//创建ImageFile文件夹
[fileManager createDirectoryAtPath:imageDocPath withIntermediateDirectories:YES attributes:nil error:nil];
//返回保存图片的路径(图片保存在ImageFile文件夹下)
NSString * imagePath = [imageDocPath stringByAppendingPathComponent:imageName];
return imagePath;
}
#pragma Delegate method UIImagePickerControllerDelegate
//图像选取器的委托方法,选完图片后回调该方法
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
{
if (image != nil) {
//选定照片后在界面显示照片并把保存按钮设为可见
self.imageView.image = image;
self.saveToFileButton.hidden = NO;
}
//关闭图像选择器
[self dismissModalViewControllerAnimated:YES];
}
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
//获取图片选取器
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
//指定代理
imagePicker.delegate = self;
//打开图片后允许编辑
imagePicker.allowsEditing = YES;
//判断图片源的类型
if (buttonIndex == 0) {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
//相机
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}
}else if (buttonIndex == 1) {
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){
//图片库
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
}
// if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
// //相册
// imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
// }
}else if (buttonIndex == [actionSheet cancelButtonIndex]) {
return;
}
//打开图片选择模态视图
[self presentModalViewController:imagePicker animated:YES];
[imagePicker release];
}
@end
中间有些操作过程我就没有一一例举了,比如如何将控件与代码关联,如何设置控件的TAG等。需要代码的朋友可以给我留言,我发你们邮箱!
欢迎关注我的新浪微博和我交流:@唐韧_Ryan
分享到:
相关推荐
主要介绍了详解iOS学习笔记(十七)——文件操作(NSFileManager),具有一定的参考价值,有需要的可以了解一下。
IOS应用源码——NSFileManager_DirectoryLocations.rar
iOS开发_iphone开发_文件系统NSFileManager_如何创建、重命名和删除文件
为了安全起见,iOS系统把每个app及其数据都放在各自的沙盒(sandbox)里面,每个app只能访问自己沙盒目录内的文件和数据等。在安装新的app时,安装程序会在沙箱目录中为app创建多个容器目录,每一个容器目录都有特定...
FCFileManager, 在NSFileManager上简化文件管理,iOS文件管理器 FCFileManager 在NSFileManager上为文件管理器提供英镑的。 为执行最常见的操作提供了许多 static 方法,只需几行代码。 默认情况下,它在文档目录中...
iOS文件管理笔记,沙盒,NSFileManager,NSFileHandle
SwiftFilePath, 简单而强大的NSFileManager封装 SwiftFilePath 简单而强大的NSFileManager封装。用法创建实例你可以从字符串创建 Path 对象。let fooDir = Path("/path/to/fooDir")//
1.利用NSFileManager的最进本的用法操作另外一个项目,同时修改所有.m文件的内容 2.同时修改多个文件夹的名称 github 地址 https://github.com/elite-kai/ELFileManager
针对NSFileManager的文件管理类工具,提供了文件操作的便携式封装。支持pod方式集成使用:pod 'ZYFileTool',或者直接将Classes里面的文件拖入项目使用。
该源码实现一款可以支持NSFileManager查看本地文件功能,几乎可以查看所有的文件,是一个不错的ios学习的例子,喜欢的朋友可以下载学习看看,。
新旧objective-cNSFileManager的差异。
FCFileManager iOS File Manager位于NSFileManager之上,用于简化文件管理。 它提供了许多静态方法,只需几行代码即可执行最常见的操作。 默认情况下,它可以在Documents目录中工作,以允许使用相对路径,但是可以在...
简单实用的iOS文件工具类 ...HYFileManager一个基于NSFileManager的文件操作类,它提供一系列的静态方法,只用少量的代码,来处理经常需要处理的文件操作,使得工作更加方便快捷。 具体使用示例请查看项目介绍: ...
这段objective c代码用于移动指定路径下的文件 代码如下: if ([fileManager copyItemAtPath:@”FilePath1″ toPath:@”FilePath2″ error:NULL]) { NSLog(@”Copied successfully”); } 方法二: 使用 ...
iPhone 文件读写操作 1,写文件操作 - (IBAction)btnWrite:(id)sender { //创建文件管理器 NSFileManager *fileManager = [NSFileManager defaultManager]; //获取路径 //参数 要获取的哪种路径 NSArray *...
用NSCoding持久化数据,以及如何用NSFileManager来有效地保存文件。
详解IOS中文件路径判断是文件还是文件夹 方法1 + (BOOL)isDirectory:(NSString *)filePath { BOOL isDirectory = NO; [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory]; ...
方法一:这段objective c代码用于删除指定路径的文件 if ([fileManager removeItemAtPath:@FilePath error:NULL]) { NSLog(@Removed successfully); } 方法二: NSFileManager *defaultManager; ...
目的 iOS和Mac App Store对应在何处... StandardPaths提供了一组简单的NSFileManager扩展方法,可以在各个平台之间以清晰一致的方式访问文件,并抽象出了在iOS 5及更高版本上应用移动备份属性禁用iCloud备份的复杂性。