【问题标题】:PHAsset Create with Adjustment Data in One Go一次性使用调整数据创建 PHAsset
【发布时间】:2018-10-04 07:03:36
【问题描述】:

TL、DR:

我想在照片库中创建一个新资产并对其应用调整数据(编辑),而不提示用户两次

背景

我正在开发一个 iOS 照片编辑扩展程序,并在容器应用程序中提供类似的功能。

为了更好的代码重用和模块化,我在扩展(必需)和容器应用程序上都采用了基于 PHContentEditingController 的流程,将所有共享组件捆绑在应用程序和扩展程序链接的嵌入式框架中(as recommended by Apple)。


与应用程序扩展程序不同,后者是“传递”图像以由照片应用程序编辑并在其监督下执行,容器应用程序需要请求对资产库进行更改,每次都会提示用户进行授权。

在启动时,该应用为用户提供了两个用于获取要编辑的图像的选项:

  • 从库中打开现有照片,或
  • 使用相机拍摄新照片。

(当然,这两个选项都依赖于UIImagePickerController

现在,从库中读取的图像与在应用程序扩展中的编辑流程相同,唯一的区别是我自己的 UI 代码在采用 @987654325 的(共享)对象上手动调用 finishContentEditing(completionHandler:) @protocol,完成后进一步调用PHAssetLibrary方法performChanges(_:completionHandler)(触发授权提示)。

这意味着在照片应用中使用扩展程序重新编辑同一图像时,可以还原在容器应用中进行的编辑(反之亦然,一旦我绕过支持调整数据)。

但是,对于用相机拍摄的新图像,我采取了不同的方法。应用过滤器后,我只是使用旧功能将结果保存到照片库:

UIImageWriteToSavedPhotosAlbum(_:_:_:_:)

(从参数标签还没有出现的时候开始 :-)


问题

这种方法的问题在于,对于使用相机拍摄并在应用程序中进行编辑的图像,编辑总是被“烘焙”(无法恢复)。这让用户感觉很随意,甚至可能让用户感到困惑,因此我正在寻找更统一的方法。

我可以在用户拍摄照片后立即将照片保存到库中,然后使用与现有资产相同的流程,但这意味着我需要修改库两次:

  1. 创建新资产
  2. 保存对新资产的编辑

...这将导致用户被要求两次许可:一次是在编辑图像之前,一次是在提交编辑时。

所以,我的问题是:

有没有办法“一次性”创建库资产、原始图像调整数据?

【问题讨论】:

    标签: ios phasset phphotolibrary


    【解决方案1】:

    虽然我还没有在我的代码上尝试过这个(我现在有more urgent issues),但我似乎在Apple's documentation for one of the initializers of the PHContentEditingOutput class 中找到了我的问题的确切答案:

    init(placeholderForCreatedAsset: PHObjectPlaceholder)
    

    来自文档:

    讨论

    如果您想将新资源添加到照片库,请使用此方法 编辑内容,而不是编辑资产的内容 将其添加到库后。例如,您可以使用此选项 如果您的应用程序将过滤器应用于它使用设备捕获的照片 相机 - 而不是只将过滤后的图像保存到照片中 库,您的应用可以保存过滤后的图像和原始图像, 允许用户恢复到原始图像或应用不同的 稍后过滤。

    还有:

    注意

    如果您的应用编辑照片中已有资产的内容 库 — 包括您的应用最近添加的资产 — 照片 提示用户更改资产内容的权限。如果 相反,您的应用程序使用 init(placeholderForCreatedAsset:) 方法 创建具有已编辑内容的资产,照片会识别您应用的 内容的所有权,因此不需要提示 用户有权对其进行编辑。


    我想我们都偶尔需要健康剂量的 RTFM! :-)

    【讨论】:

    • 公平地说,这个 API 绝对是我见过 Apple 做的最糟糕的事情。
    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2021-04-01
    • 2022-07-29
    相关资源
    最近更新 更多