1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
import UIKit
import Photos
class CollectionViewController : UICollectionViewController {
///取得的资源结果,用了存放的PHAsset
var assetsFetchResults: PHFetchResult !
///缩略图大小
var assetGridThumbnailSize: CGSize !
/// 带缓存的图片管理对象
var imageManager: PHCachingImageManager !
override func viewWillAppear(animated: Bool ) {
super .viewWillAppear(animated)
//根据单元格的尺寸计算我们需要的缩略图大小
let scale = UIScreen .mainScreen().scale
let cellSize = ( self .collectionViewLayout as ! UICollectionViewFlowLayout ).itemSize
assetGridThumbnailSize = CGSizeMake ( cellSize.width*scale , cellSize.height*scale)
}
override func viewDidLoad() {
super .viewDidLoad()
//则获取所有资源
let allPhotosOptions = PHFetchOptions ()
//按照创建时间倒序排列
allPhotosOptions.sortDescriptors = [ NSSortDescriptor (key: "creationDate" ,
ascending: false )]
//只获取图片
allPhotosOptions.predicate = NSPredicate (format: "mediaType = %d" ,
PHAssetMediaType . Image .rawValue)
assetsFetchResults = PHAsset .fetchAssetsWithMediaType( PHAssetMediaType . Image ,
options: allPhotosOptions)
// 初始化和重置缓存
self .imageManager = PHCachingImageManager ()
self .resetCachedAssets()
}
//重置缓存
func resetCachedAssets(){
self .imageManager.stopCachingImagesForAllAssets()
}
// CollectionView行数
override func collectionView(collectionView: UICollectionView ,
numberOfItemsInSection section: Int ) -> Int {
return self .assetsFetchResults.count
}
// 获取单元格
override func collectionView(collectionView: UICollectionView ,
cellForItemAtIndexPath indexPath: NSIndexPath )
-> UICollectionViewCell {
// storyboard里设计的单元格
let identify: String = "DesignViewCell"
// 获取设计的单元格,不需要再动态添加界面元素
let cell = ( self .collectionView?.dequeueReusableCellWithReuseIdentifier(
identify, forIndexPath: indexPath))! as UICollectionViewCell
let asset = self .assetsFetchResults[indexPath.row] as ! PHAsset
//获取缩略图
self .imageManager.requestImageForAsset(asset, targetSize: assetGridThumbnailSize,
contentMode: PHImageContentMode . AspectFill ,
options: nil ) { (image, nfo) in
(cell.contentView.viewWithTag(1) as ! UIImageView ).image = image
print (image)
}
return cell
}
// 单元格点击响应
override func collectionView(collectionView: UICollectionView ,
didSelectItemAtIndexPath indexPath: NSIndexPath ) {
let myAsset = self .assetsFetchResults[indexPath.row] as ! PHAsset
//这里不使用segue跳转(建议用segue跳转)
let detailViewController = UIStoryboard (name: "Main" , bundle: nil )
.instantiateViewControllerWithIdentifier( "detail" )
as ! ImageDetailViewController
detailViewController.myAsset = myAsset
// navigationController跳转到detailViewController
self .navigationController!.pushViewController(detailViewController,
animated: true )
}
override func didReceiveMemoryWarning() {
super .didReceiveMemoryWarning()
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
import UIKit
import Photos
class ImageDetailViewController : UIViewController {
//选中的图片资源
var myAsset: PHAsset !
//用于显示图片信息
@IBOutlet weak var textView: UITextView !
//用于显示原图
@IBOutlet weak var imageView: UIImageView !
override func viewDidLoad() {
super .viewDidLoad()
//获取文件名
PHImageManager .defaultManager().requestImageDataForAsset(myAsset, options: nil ,
resultHandler: {
_, _, _, info in
self .title = (info![ "PHImageFileURLKey" ] as ! NSURL ).lastPathComponent
})
//获取图片信息
textView.text = "日期:\(myAsset.creationDate!)\n"
+ "类型:\(myAsset.mediaType.rawValue)\n"
+ "位置:\(myAsset.location)\n"
+ "时长:\(myAsset.duration)\n"
//获取原图
PHImageManager .defaultManager().requestImageForAsset(myAsset,
targetSize: PHImageManagerMaximumSize , contentMode: . Default ,
options: nil , resultHandler: {
(image, _: [ NSObject : AnyObject ]?) in
self .imageView.image = image
})
}
override func didReceiveMemoryWarning() {
super .didReceiveMemoryWarning()
}
}
|