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];
}