【发布时间】:2016-02-26 10:15:33
【问题描述】:
有没有办法在我的 iOS 应用程序中访问从我的应用程序截取的所有屏幕截图?
如果不可能,有没有办法只用截图相册(来自所有应用程序)打开图像选择器控制器(UIImagePickerController)?
谢谢。
【问题讨论】:
标签: ios objective-c swift uiimagepickercontroller screenshot
有没有办法在我的 iOS 应用程序中访问从我的应用程序截取的所有屏幕截图?
如果不可能,有没有办法只用截图相册(来自所有应用程序)打开图像选择器控制器(UIImagePickerController)?
谢谢。
【问题讨论】:
标签: ios objective-c swift uiimagepickercontroller screenshot
除了这里定义的源类型之外,没有办法呈现标准 UIImagePickerController
但是,有一种方法可以抓取屏幕截图的相册并将其呈现在自己的 UI 中。根据文档,您可以执行以下操作:
let options = PHFetchOptions()
options.predicate = NSPredicate(format: "localizedTitle = Screenshots")
let collections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .Any, options: options)
let sceenShots = collections.firstObject as? PHAssetCollection
但是由于错误(上面会因为谓词而崩溃),您可以获取所有专辑,然后过滤屏幕截图的专辑(适用于 iOS8+)
let collections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .Any, options: nil)
var screenshots: PHAssetCollection?
collections.enumerateObjectsUsingBlock {
(collection, _, _) -> Void in
if collection.localizedTitle == "Screenshots" {
screenshots = collection as? PHAssetCollection
}
}
或者,如果你的目标是 iOS9+,你可以这样做:
let collections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumScreenshots, options: nil)
let screenshots = collections.lastObject as? PHAssetCollection
还请记住,无法从特定应用中截取屏幕截图。
【讨论】:
assetCollectionSubtype,看看是不是SmartAlbumScreenshots。
SmartAlbumScreenshots 从 iOS9 开始可用
我还考虑了一种不同的方式来访问从我的应用中截取的所有屏幕截图。想法是用 UIApplicationUserDidTakeScreenshotNotification 截取屏幕截图,然后检索并保存文件 URL(或复制文件):
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(screenshotDetected) name:UIApplicationUserDidTakeScreenshotNotification object:nil];
- (void)screenshotDetected {
PHFetchResult<PHAssetCollection *> *albums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumScreenshots options:nil];
[albums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull album, NSUInteger idx, BOOL * _Nonnull stop) {
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.wantsIncrementalChangeDetails = YES;
options.predicate = [NSPredicate predicateWithFormat:@"mediaType == %d",PHAssetMediaTypeImage];
PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:album options:options];
[assets enumerateObjectsUsingBlock:^(PHAsset * _Nonnull asset, NSUInteger idx, BOOL * _Nonnull stop) {
// do things
}];
}];
}
问题是最后一个屏幕截图,即触发通知的屏幕截图,在代码执行时尚不可用。
【讨论】: