iOS开发————几种图片加载方式

作为编者自己的一个复习总结以及广大iOS开发初学者的小小福利,呕心沥血诞生出这篇图片加载方式的文章,如有不足请指正。

先谈谈iOS图像加载方式的分类吧。

本地加载:从程序包中加载,从沙盒加载以及从本地相册加载。

网络加载:根据网络地址来加载图片。

先总结网络加载:NSData提供了简单的网络数据加载,这个数据当然包括了图像数据啦,NSData和UIImage之间可以互相转换。

举例:加载网络图片到屏幕

注意前提:将info.plist文件中添加App Transport Security Settings,在其中添加Allow Arbitrary Loads并设置为YES。

– (void)viewDidLoad {
[super viewDidLoad];

//创建一个屏幕大小的imageView来显示图片
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];

//获取网络图片地址
NSURL *url = [NSURL URLWithString:@”http://www.gooii.com/wp-content/uploads/2013/02/apple_logo.png”];

//将网络地址的NSString类型转化为NSData类型
NSData *data = [NSData dataWithContentsOfURL:url];

//image与data的相互转换
UIImage *image = [UIImage imageWithData:data];

//配置图片到imageView上
imageView.image = image;

//将imageView添加到当前视图上去
[self.view addSubview:imageView];

}

再说本地加载:
从程序包中加载:程序包就是我们下载一个APP时它本身的包,比如一些图标,控件图片等都在程序包中,当然我们也可以在制作APP时将一些必要的图片放到程序包中,通过这些图片加载到界面的过程就是从程序包中加载。

举例:从程序包加载图片

– (void)viewDidLoad {
[super viewDidLoad];

//创建一个屏幕大小的imageView
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];

//获取程序包内图片根路径
NSString *resourcePath = [[NSBundle mainBundle] resourcePath];<pre name=”code” class=”html”><span style=”font-family: Arial, Helvetica, sans-serif;”> </span>
//图像路径 NSString *path = [resourcePath stringByAppendingPathComponent:@”gem.jpeg”]; //创建图片 UIImage *image = [UIImage imageWithContentsOfFile:path]; //将图片添加到imageView imageView.image = image; [self.view addSubview:imageView]; }

从沙盒加载图片:
每个APP都有一个独立的沙盒,其中存放着App中的本地文件,比如音频,视频,图片,文字等。当前App无权访问其他App的沙盒。

沙盒目录中有如下子目录:

Document:存放长期使用的文件。其中在该App中下载或者保存的文件都在其中。

Library:存放系统文件。

tmp:存放临时文件,App重启时,该;目录下的文件清空。

举例:从沙盒中的文件加载图片

– (void)viewDidLoad {
[super viewDidLoad];

//创建屏幕大小的imageView
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];

//获取沙盒路径
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@”Documents/gem.jpeg”];

//打印沙盒路径
NSLog(@”%@”, NSHomeDirectory());

//获取路径对应的图片文件
UIImage *image = [UIImage imageWithContentsOfFile:path];

//给imageView添加视图文件
imageView.image = image;

//将imageView添加到屏幕
[self.view addSubview:imageView];
}

从相册加载图片文件:首先是获取到相册,在选择图片加载,相册资源访问通过UIImagePickerController类来读取,该类继承自UINavigationController,是个地理的导航控制器,一般使用模态窗口的方式弹出。

举例:从相册资源中加载图片

#import “ViewController.h”

@interface ViewController () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>

//在storyboard中设置显示图片的imageView
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

//在storyboard中设置选取图片的按钮
– (IBAction)getPhoto:(id)sender {

//用户的相册资源通过UIImagePickerController读取
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

//设置代理
imagePicker.delegate = self;

//常用属性
//选择的资源类型
// UIImagePickerControllerSourceTypePhotoLibrary,所有同步到iPhone的图像及用户拍摄的图片在内的相册照片
// UIImagePickerControllerSourceTypeCamera,通过相机拍摄
// UIImagePickerControllerSourceTypeSavedPhotosAlbum,仅含相册

// 判断当前设备是否有摄像头
// UIImagePickerControllerCameraDeviceRear,后置摄像头

BOOL isCamera = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];

// sourceType属性可指定选取器要选取的资源类型
// 如果有摄像头则通过相机拍摄取照片
if (isCamera) {
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

// 否则通过相册取照片
} else {
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

}

//通过模态视图打开
[self presentViewController:imagePicker animated:YES completion:nil];

}

– (IBAction)getVideo:(id)sender {

}

//读取完成后调用,info包含了许多数据,
– (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {

//打印info中的数据
NSLog(@”info = %@”, info);

//获取媒体类型
NSString *type = info[UIImagePickerControllerMediaType];

//判断是否是图片类型
if ([type isEqualToString:@”public.image”]) {

//将图片显示到视图中
_imageView.image = info[UIImagePickerControllerOriginalImage];

//模态视图自动退出相册
[picker dismissViewControllerAnimated:YES completion:nil];
}
}

//模态视图方式取消选择退回原界面
– (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

NSLog(@”取消选择”);

[picker dismissViewControllerAnimated:YES completion:nil];
}