摘自Mattt Thompson 的PHImage?Manager
1、tableView 中使用 PHImageManager加載圖片
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let manager = PHImageManager.defaultManager()
if cell.tag != 0 {
manager.cancelImageRequest(PHImageRequestID(cell.tag))
}
let asset = assets[indexPath.row]
if let creationDate = asset.creationDate {
cell.textLabel?.text = NSDateFormatter.localizedStringFromDate(creationDate,
dateStyle: .MediumStyle,
timeStyle: .MediumStyle
)
} else {
cell.textLabel?.text = nil
}
cell.tag = Int(manager.requestImageForAsset(asset,
targetSize: CGSize(width: 100.0, height: 100.0),
contentMode: .AspectFill,
options: nil) { (result, _) in
if let destinationCell = tableView.cellForRowAtIndexPath(indexPath) {
destinationCell.imageView?.image = result
}
})
return cell
}
2、PHCachingImageManager 緩存需要顯示的圖片 with Swift 的willSet / didSet hooks
let cachingImageManager = PHCachingImageManager()
var assets: [PHAsset] = [] {
willSet {
cachingImageManager.stopCachingImagesForAllAssets()
}
didSet {
cachingImageManager.startCachingImagesForAssets(self.assets,
targetSize: PHImageManagerMaximumSize,
contentMode: .AspectFit,
options: nil
)
}
}
3炮赦、使用 PHImageManager 和 PHImageRequestOptions 的復(fù)雜功能來做人臉識別
let asset: PHAsset
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var progressView: UIProgressView!
override func viewDidLoad() {
super.viewDidLoad()
let manager = PHImageManager.defaultManager()
let initialRequestOptions = PHImageRequestOptions()
initialRequestOptions.synchronous = true
initialRequestOptions.resizeMode = .Fast
initialRequestOptions.deliveryMode = .FastFormat
manager.requestImageForAsset(asset,
targetSize: CGSize(width: 250.0, height: 250.0),
contentMode: .AspectFit,
options: initialRequestOptions) { (initialResult, _) in
guard let ciImage = initialResult?.CIImage else {
return
}
let finalRequestOptions = PHImageRequestOptions()
finalRequestOptions.progressHandler = { (progress, _, _, _) in
self.progressView.progress = Float(progress)
}
let detector = CIDetector(
ofType: CIDetectorTypeFace,
context: nil,
options: [CIDetectorAccuracy: CIDetectorAccuracyLow]
)
let features = detector.featuresInImage(ciImage)
if features.count > 0 {
var rect = CGRectZero
features.forEach {
rect.unionInPlace($0.bounds)
}
let transform = CGAffineTransformMakeScale(1.0 / initialResult!.size.width, 1.0 / initialResult!.size.height)
finalRequestOptions.normalizedCropRect = CGRectApplyAffineTransform(rect, transform)
}
manager.requestImageForAsset(self.asset,
targetSize: PHImageManagerMaximumSize,
contentMode: .AspectFit,
options: finalRequestOptions) { (finalResult, _) in
self.imageView.image = finalResult
}
}
}