【发布时间】:2018-10-22 12:27:24
【问题描述】:
我正在为 iOS 开发一个照片编辑扩展程序,它捆绑在一个提供相同照片编辑功能的容器应用程序中。
为了重用代码,我有一个视图控制器类,它采用了所需的PHContentEditingController 协议,我将它子类化为既用作应用扩展的主界面,又用作容器的“工作屏幕”应用程序。
在编辑扩展上,控制器的方法由照片应用的编辑会话调用,如 Apple 文档和您可以在网络上找到的各种教程中所述。 p>
在容器应用上,另一方面,我先通过UIImagePickerController类获取一个PHAsset实例,直接启动编辑会话像这样在我的“工作”视图控制器上手动操作:
// 'work' is my view controller which adopts
// `PHContentEditingController`. 'workNavigation'
// embeds it.
let options = PHContentEditingInputRequestOptions()
options.canHandleAdjustmentData = { (adjustmentData) in
return work.canHandle(adjustmentData)
}
asset.requestContentEditingInput(with: options, completionHandler: { [weak self] (input, options) in
// (Called on the Main thread on iOS 10.0 and above)
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
// nil output results in "Revert" prompt.
// non-nil output results in "Modify" prompt.
let library = PHPhotoLibrary.shared()
library.performChanges({
let request = PHAssetChangeRequest(for: self.asset)
request.contentEditingOutput = output
}, completionHandler: {(didSave, error) in
if let error = error {
// handle error...
} else if didSave {
// proceed after saving...
} else {
// proceed after cancellation...
}
})
})
在编辑会话中,用户可以“清除”以前作为调整数据传递的编辑,从而有效地将图像恢复到其原始状态。
我注意到,如果我通过调用传递给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 {
// We began with non-nil adjustment data but now have
// no outstanding edits - means REVERT:
return completionHandler(nil)
}
// (...proceed with writing output to url...)
但是,这仅在从容器应用程序运行时有效。如果我尝试使用 extension 中的相同技巧(即,加载包含先前编辑的图像,请重置他们,然后点击“完成”)我收到可怕的“无法保存更改”消息...
从照片编辑扩展程序中恢复以前对图像的编辑的正确方法是什么?
【问题讨论】:
-
我想我会通过反复试验来解决这个问题...
标签: ios photosframework