我正在为iOS开发一个照片编辑扩展,捆绑在一个提供相同照片编辑功能的容器应用程序中。
为了重用代码,我有一个视图控制器类,它采用了
PHContentEditingController
协议,我对它进行了子类化,既可以作为应用程序扩展的主界面,也可以作为容器应用程序的“工作屏幕”。
在编辑扩展名上,
控制器的方法是由照片应用程序的编辑会话调用的,如苹果的文档和您可以在网络上找到的各种教程所述。
在容器应用程序上,
另一方面,我首先得到
PHAsset
实例通过
UIImagePickerController
类,然后直接在“工作”视图控制器上手动启动编辑会话,如下所示:
let options = PHContentEditingInputRequestOptions()
options.canHandleAdjustmentData = { (adjustmentData) in
return work.canHandle(adjustmentData)
}
asset.requestContentEditingInput(with: options, completionHandler: { [weak self] (input, options) in
guard let this = self else {
return
}
guard let editingInput = input else {
return
}
work.asset = asset
work.startContentEditing(with: editingInput, placeholderImage: editingInput.displaySizeImage!)
this.present(workNavigation, animated: true, completion: nil)
})
当用户完成编辑时
,工作视图控制器调用
finishContentEditing(completionHandler:
自行完成会话:
self.finishContentEditing(completionHandler: {(output) in
let library = PHPhotoLibrary.shared()
library.performChanges({
let request = PHAssetChangeRequest(for: self.asset)
request.contentEditingOutput = output
}, completionHandler: {(didSave, error) in
if let error = error {
} else if didSave {
} else {
}
})
})
在编辑会话中,用户可以“清除”以前作为
调整数据
,有效地将图像恢复到其原始状态。
我注意到,如果我通过调用传递给
finishContentEditing(completionHandler:)
具有
nil
作为其参数(而不是
PHContentEditingOutput
对象),照片框架将提示用户“还原”图像,而不是“修改”图像:
func finishContentEditing(completionHandler: @escaping (PHContentEditingOutput?) -> Void) {
guard let editingInput = self.editingInput, let inputURL = editingInput.fullSizeImageURL else {
return completionHandler(nil)
}
if editingInput.adjustmentData != nil && hasUnsavedEdits == false {
return completionHandler(nil)
}
但是,这只在从容器应用程序运行时有效。
如果我尝试同样的技巧
延伸
(例如,加载包含以前编辑的图像,重置它们,然后点击“完成”)我会害怕
“无法保存更改”
消息…
从照片编辑扩展名中恢复对图像的先前编辑的正确方法是什么?