【问题标题】:iOS Photos Framework data UTI or format when image is in cloud图像在云中时的 iOS 照片框架数据 UTI 或格式
【发布时间】:2015-05-21 07:27:42
【问题描述】:

我正在升级我的 GIF 应用程序以使用 iOS 8 照片框架,基本上我想在他们的照片库中找到所有用户的 GIF 并显示它们。在 iCloud 照片库的“优化存储”发挥作用之前与 ALAssetLibrary 合作得很好,因为现在用户可以在云中拥有大量图像,因此需要使用照片框架来获取它们 不幸的是,你似乎可以'在您从云端下载 PHAsset 是 GIF 还是普通的静态图像之前,无法判断它是什么……当您的网络连接为零或网络连接不佳时,这将使我的应用程序变得非常糟糕……

这是我用来尝试仅获取 GIF 的代码:

PHFetchOptions* fetchOptions = [[PHFetchOptions alloc] init];
            fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
            PHFetchResult *allPhotosResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options: fetchOptions];

            //   Get assets from the PHFetchResult object
            [allPhotosResult enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
                //NSLog(@"asset %@", asset);
                PHImageRequestOptions* options = [[PHImageRequestOptions alloc] init];
                options.synchronous = YES;
                options.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
[imageManager requestImageDataForAsset: asset options: options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {

// when the item is in the cloud dataUTI is nil so I can't check what format it is...

}

信息字典包含一些未记录的键:

  • PHImageResultDeliveredImageFormatKey
  • PHImageResultWantedImageFormat

我看到的值为 9999、9998 和 40xx。但它们似乎与图像是否是 GIF 并没有特别相关,因此必须完全与其他东西相关......

有什么想法吗??

【问题讨论】:

    标签: ios objective-c photosframework


    【解决方案1】:

    使用此选项!

    PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
        options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
        options.networkAccessAllowed = YES;
    

    【讨论】:

    • 这需要先从云端下载图像,然后才能了解它,这是我试图避免的问题......我想在尝试任何网络活动之前知道 PHAsset 的格式,但是它似乎没有暴露......只有资产是图像还是视频:(
    【解决方案2】:

    如果不从云端下载图像并进行检查,似乎没有办法解决这个问题。我正在更新我的应用程序以执行此操作,但要记住每个图像的类型与 PHAssetlocalIdentifier 相对应,以便它只需要执行一次。

    如果您采用这种方法,您可能还希望避免使用PHAssets,因为它们不会是 gif 图像(当然也排除视频!)

    【讨论】:

      【解决方案3】:

      有一个解决方案,但仅适用于 IOS 9,他们添加了一个新结构

      typedef NS_OPTIONS(NSUInteger, PHAssetSourceType) {
       PHAssetSourceTypeNone            = 0,
       PHAssetSourceTypeUserLibrary     = (1UL << 0),
       PHAssetSourceTypeCloudShared     = (1UL << 1),
       PHAssetSourceTypeiTunesSynced    = (1UL << 2),
      } NS_AVAILABLE_IOS(9_0);
      

      还有

      Added PHAssetResourceType [enum]
      Added PHAssetResourceType.AdjustmentBasePhoto
      Added PHAssetResourceType.AdjustmentData
      Added PHAssetResourceType.AlternatePhoto
      Added PHAssetResourceType.Audio
      Added PHAssetResourceType.FullSizePhoto
      Added PHAssetResourceType.FullSizeVideo
      Added PHAssetResourceType.Photo
      Added PHAssetResourceType.Video
      

      【讨论】:

      • 这无济于事,因为它只是告诉你它来自哪里,你可以很容易地找到它。问题是找出云中图像的文件扩展名,找到 gif 而无需全部检查
      • 好的,我误解了这个问题,也许你可以在这里回答我的问题stackoverflow.com/q/30888329/1463518
      猜你喜欢
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 2015-10-20
      • 1970-01-01
      相关资源
      最近更新 更多