标签:
1.下载MJExtension 数据转模型库
2.自定义cell 大致布局如下
大致实现的效果如下 《我适配横屏了 大家可随意》
让TableView支持横屏的代码如下:
//支持横屏
myTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;

现在iOS9之后用#import <Photos/Photos.h>这个框架 据说更为强大 稍后有时间我会研究研究一下贴出来给大家看一下
首先用到了这几个框架 这是iOS9以下的框架和类
#import <AssetsLibrary/ALAsset.h>
#import <AssetsLibrary/ALAssetsLibrary.h>
#import <AssetsLibrary/ALAssetsGroup.h>
#import <AssetsLibrary/ALAssetRepresentation.h>
// 将原始图片的URL转化为NSData数据,写入沙盒
- (void)imageWithUrl:(NSURL *)url withFileName:(NSString *)fileName
{
// 进这个方法的时候也应该加判断,如果已经转化了的就不要调用这个方法了
// 如何判断已经转化了,通过是否存在文件路径
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
// 创建存放原始图的文件夹--->OriginalPhotoImages
NSFileManager * fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:KOriginalPhotoImagePath]) {
[fileManager createDirectoryAtPath:KOriginalPhotoImagePath withIntermediateDirectories:YES attributes:nil error:nil];
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if (url) {
// 主要方法
[assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc((unsigned long)rep.size);
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:((unsigned long)rep.size) error:nil];
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
NSString * imagePath = [KOriginalPhotoImagePath stringByAppendingPathComponent:fileName];
[data writeToFile:imagePath atomically:YES];
} failureBlock:nil];
}
});
}
// 将原始视频的URL转化为NSData数据,写入沙盒
- (void)videoWithUrl:(NSURL *)url withFileName:(NSString *)fileName
{
// 解析一下,为什么视频不像图片一样一次性开辟本身大小的内存写入?
// 想想,如果1个视频有1G多,难道直接开辟1G多的空间大小来写?
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if (url) {
[assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
ALAssetRepresentation *rep = [asset defaultRepresentation];
NSString * videoPath = [KCachesPath stringByAppendingPathComponent:fileName];
char const *cvideoPath = [videoPath UTF8String];
FILE *file = fopen(cvideoPath, "a+");
if (file) {
const int bufferSize = 1024 * 1024;
// 初始化一个1M的buffer
Byte *buffer = (Byte*)malloc(bufferSize);
NSUInteger read = 0, offset = 0, written = 0;
NSError* err = nil;
if (rep.size != 0)
{
do {
read = [rep getBytes:buffer fromOffset:offset length:bufferSize error:&err];
written = fwrite(buffer, sizeof(char), read, file);
offset += read;
} while (read != 0 && !err);//没到结尾,没出错,ok继续
}
// 释放缓冲区,关闭文件
free(buffer);
buffer = NULL;
fclose(file);
file = NULL;
}
} failureBlock:nil];
}
});
}
#import "ViewController.h"
#import <Social/Social.h>
#import <AssetsLibrary/ALAsset.h>
#import <AssetsLibrary/ALAssetsLibrary.h>
#import <AssetsLibrary/ALAssetsGroup.h>
#import <AssetsLibrary/ALAssetRepresentation.h>
#import "YY_FileTableViewCell.h"
#import "MJExtension.h"
#import "Model.h"
#import <CoreLocation/CoreLocation.h>
// 照片原图路径
#define KOriginalPhotoImagePath [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"OriginalPhotoImages"]
// 视频URL路径
#define KVideoUrlPath [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"VideoURL"]
// caches路径
#define KCachesPath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
{
UITableView *myTableView;
NSMutableArray *imagesList;
NSMutableArray *timeStringList;
NSMutableArray *locationStringList;
NSMutableArray *locationLists;
NSMutableArray *models;
NSMutableArray *locationsModels;
CLGeocoder *geocoder;
}
@end
@implementation ViewController
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self getAllPhotosFromSystemPhotosLibrary];
self.view.backgroundColor = [UIColor whiteColor];
self.edgesForExtendedLayout = UIRectEdgeNone;
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
}
- (void)viewDidLoad {
[super viewDidLoad];
imagesList = [NSMutableArray array];
timeStringList = [NSMutableArray array];
locationStringList = [NSMutableArray array];
models = [NSMutableArray array];
locationsModels = [NSMutableArray array];
locationLists = [NSMutableArray array];
geocoder = [[CLGeocoder alloc]init];
[self loadUI];
}
- (void)loadUI{
myTableView = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
myTableView.delegate = self;
myTableView.rowHeight = 100;
myTableView.dataSource = self;
//支持横屏
myTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
[self.view addSubview:myTableView];
/*
34.3830750000 Latitude
114.2750620000 Longitude
*/
//测试
}
#pragma mark ======获取到系统相册的所有图片=======
- (NSString *)stringFromDate:(NSDate *)date{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//zzz表示时区,zzz可以删除,这样返回的日期字符将不包含时区信息。
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *destDateString = [dateFormatter stringFromDate:date];
return destDateString;
}
- (NSString *)returnPlaceStringLatitudeText:(NSString *)LatitudeText LongtitudeText:(NSString *)LongtitudeText{
//dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
CLLocation *location = [[CLLocation alloc]initWithLatitude:[LatitudeText doubleValue] longitude:[LongtitudeText doubleValue]];
__block NSString *place;
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (error||placemarks.count==0) {
place = @"未知的位置";
NSLog(@"%@",place);
}
else{
place = placemarks.firstObject.name;
NSLog(@"%@",place);
}
}];
return place;
}
//获取相册里的所有图片
- (void)getAllPhotosFromSystemPhotosLibrary{
/*
NSString *paths = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"OriginalPhotoImages"];
NSLog(@"paths%@",paths);
如果本地存储的路径里有 则读取本地的目录的 如果没有则读取相册里的
if (paths) {
NSFileManager *fm = [NSFileManager defaultManager];
//获取目录下图片的所有名字 比如说IMG_0004.JPG
NSArray *files = [fm subpathsAtPath:paths];
for (NSString *fileName in files) {
NSLog(@"%@",fileName);
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"OriginalPhotoImages/%@",fileName]];
UIImage *image = [UIImage imageWithContentsOfFile:path];
NSLog(@"image = %@",image);
[imagesList addObject:image];
}
}
*/
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init];//生成整个photolibrary的实例
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {//获取所有group
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
//从group里面
NSString* assetType = [result valueForProperty:ALAssetPropertyType];
if ([assetType isEqualToString:ALAssetTypePhoto]) {
//NSLog(@"Photo");
NSDate *date= [result valueForProperty:ALAssetPropertyDate];
UIImage *image = [UIImage imageWithCGImage:[result thumbnail]];
NSString *fileName = [[result defaultRepresentation] filename];
NSURL *url = [[result defaultRepresentation] url];
NSDictionary *dict = [[result defaultRepresentation]metadata];
//int64_t fileSize = [[result defaultRepresentation] size];
/*
2016-06-27 13:55:17.024 Share_First[2941:1062832] Photo
2016-06-27 13:55:17.029 Share_First[2941:1062832] date = 2011-03-13 00:17:25 +0000
2016-06-27 13:55:17.030 Share_First[2941:1062832] fileName = IMG_0001.JPG
2016-06-27 13:55:17.030 Share_First[2941:1062832] url = assets-library://asset/asset.JPG?id=106E99A1-4F6A-45A2-B320-B0AD4A8E8473&ext=JPG
2016-06-27 13:55:17.030 Share_First[2941:1062832] fileSize = 1896240
*/
//NSLog(@"元数据=%@",dict);
//NSLog(@"date = %@",date);//照片拍摄时间
//NSLog(@"fileName = %@",fileName);//照片名称
//NSLog(@"url = %@",url);//照片文件URL(非网络URL 浏览器上输入这个URL找不到这张图片 我试了)
//NSLog(@"fileSize = %lld",fileSize);//照片文件size 具体单位不知道是什么 肯定不是MshareImageView
//latitude:纬度
//longitude:经度
NSString *Longitude = dict[@"{GPS}"][@"Longitude"];
NSString *Latitude = dict[@"{GPS}"][@"Latitude"];
if (Longitude==nil||Latitude==nil) {
Longitude = @"";
Latitude = @"";
}
NSLog(@"longitude= %@ Latitude = %@",Longitude,Latitude);
[locationLists addObject:@{@"Longitude":Longitude,@"Latitude":Latitude}];
locationsModels = [Model mj_objectArrayWithKeyValuesArray:locationLists];
[timeStringList addObject:@{@"timeString":[self stringFromDate:date]}];
models = [Model mj_objectArrayWithKeyValuesArray:timeStringList];
[imagesList addObject:image];
//读取完照片之后写入APP沙河cache目录 这个方法我在网上找到的
[self imageWithUrl:url withFileName:fileName];
//回到主线程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
[myTableView reloadData];
});
}else if([assetType isEqualToString:ALAssetTypeVideo]){
NSLog(@"Video");
NSDate *date= [result valueForProperty:ALAssetPropertyDate];
UIImage *image = [UIImage imageWithCGImage:[result thumbnail]];
NSString *fileName = [[result defaultRepresentation] filename];
NSURL *url = [[result defaultRepresentation] url];
int64_t fileSize = [[result defaultRepresentation] size];
NSLog(@"date = %@",date);
NSLog(@"fileName = %@",fileName);
NSLog(@"url = %@",url);
NSLog(@"fileSize = %lld",fileSize);
NSLog(@"image = %@",image);
[self videoWithUrl:url withFileName:fileName];
}else if([assetType isEqualToString:ALAssetTypeUnknown]){
NSLog(@"Unknow AssetType");
}
//-----------可解开----------
/*
NSDictionary *assetUrls = [result valueForProperty:ALAssetPropertyURLs];
for (NSString *assetURLKey in assetUrls) {
NSLog(@"%@",[assetUrls objectForKey:assetURLKey]);
}
*/
}];
} failureBlock:^(NSError *error) {
NSLog(@"Enumerate the asset groups failed.");
}];
}
// 将原始图片的URL转化为NSData数据,写入沙盒
- (void)imageWithUrl:(NSURL *)url withFileName:(NSString *)fileName
{
// 进这个方法的时候也应该加判断,如果已经转化了的就不要调用这个方法了
// 如何判断已经转化了,通过是否存在文件路径
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
// 创建存放原始图的文件夹--->OriginalPhotoImages
NSFileManager * fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:KOriginalPhotoImagePath]) {
[fileManager createDirectoryAtPath:KOriginalPhotoImagePath withIntermediateDirectories:YES attributes:nil error:nil];
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if (url) {
// 主要方法
[assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc((unsigned long)rep.size);
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:((unsigned long)rep.size) error:nil];
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
NSString * imagePath = [KOriginalPhotoImagePath stringByAppendingPathComponent:fileName];
[data writeToFile:imagePath atomically:YES];
} failureBlock:nil];
}
});
}
// 将原始视频的URL转化为NSData数据,写入沙盒
- (void)videoWithUrl:(NSURL *)url withFileName:(NSString *)fileName
{
// 解析一下,为什么视频不像图片一样一次性开辟本身大小的内存写入?
// 想想,如果1个视频有1G多,难道直接开辟1G多的空间大小来写?
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if (url) {
[assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
ALAssetRepresentation *rep = [asset defaultRepresentation];
NSString * videoPath = [KCachesPath stringByAppendingPathComponent:fileName];
char const *cvideoPath = [videoPath UTF8String];
FILE *file = fopen(cvideoPath, "a+");
if (file) {
const int bufferSize = 1024 * 1024;
// 初始化一个1M的buffer
Byte *buffer = (Byte*)malloc(bufferSize);
NSUInteger read = 0, offset = 0, written = 0;
NSError* err = nil;
if (rep.size != 0)
{
do {
read = [rep getBytes:buffer fromOffset:offset length:bufferSize error:&err];
written = fwrite(buffer, sizeof(char), read, file);
offset += read;
} while (read != 0 && !err);//没到结尾,没出错,ok继续
}
// 释放缓冲区,关闭文件
free(buffer);
buffer = NULL;
fclose(file);
file = NULL;
}
} failureBlock:nil];
}
});
}
/*
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.判断平台是否可用
if (![SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo]) {
NSLog(@"平台不可用,或者没有配置相关的帐号");
return;
}
// 2.创建分享的控制器
SLComposeViewController *composeVc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];
// 2.1.添加分享的文字
[composeVc setInitialText:@"我是一个codeMan"];
// 2.2.添加一个图片
[composeVc addImage:[UIImage imageNamed:@"xingxing"]];
// 2.3.添加一个分享的链接
[composeVc addURL:[NSURL URLWithString:@"www.baidu.com"]];
// 3.弹出分享控制器
[self presentViewController:composeVc animated:YES completion:nil];
// 4.监听用户点击了取消还是发送
composeVc.completionHandler = ^(SLComposeViewControllerResult result) {
if (result == SLComposeViewControllerResultCancelled) {
NSLog(@"点击了取消");
} else {
NSLog(@"点击了发送");
}
};
}
*/
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return models.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
YY_FileTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[YY_FileTableViewCell ID]];;
if (!cell) {
cell = [YY_FileTableViewCell YY_FileTableViewCell];
}
cell.block = ^(YY_FileTableViewCell *cell){
//点击按钮的时候调用
NSIndexPath *path = [tableView indexPathForCell:cell];
NSLog(@"组%ld 行%ld ",path.section,path.row);
};
Model *model = models[indexPath.row];
Model *model1 = locationsModels[indexPath.row];
NSLog(@"Latitude = %@",model1.Latitude);
NSLog(@"Longitude = %@",model1.Longitude);
cell.Longtitude = model1.Longitude;
cell.Latitude = model1.Latitude;
cell.timeLabel.adjustsFontSizeToFitWidth = YES;
cell.locationLabel.adjustsFontSizeToFitWidth = YES;
cell.timeLabel.text = model.timeString;
cell.shareImageView.image = imagesList[indexPath.row];
cell.locationLabel.text = [NSString stringWithFormat:@"纬度 = %@ 经度 = %@",model1.Latitude,model1.Longitude];
return cell;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
标签:
原文地址:http://www.cnblogs.com/start-ios/p/5627708.html