Я разрабатываю приложение, которое позволяет пользователям редактировать фотографии с помощью PhotoKit. Я ранее сохранял отредактированную фотографию на диск как JPEG. Я хотел бы избежать преобразования в JPEG и внедрил модификации для этого. Он отлично работает для фотографий, сделанных с помощью камеры, но если вы попытаетесь отредактировать скриншот, произойдет сбой блока PHPhotoLibrary.sharedPhotoLibrary().performChanges
и войдите в систему The operation couldn’t be completed. (Cocoa error -1.)
. Я не уверен, почему это заставляет блок executeChanges сбой, что я сделал неправильно здесь?Невозможно отредактировать скриншоты, выполнить блок блоков изменения не удается
Я создал sample app available to download, который демонстрирует проблему, и я включил соответствующий код ниже. Приложение пытается отредактировать самую новую фотографию в вашей фотобиблиотеке. Если он преуспеет, он предложит получить доступ к редактированию фотографии, иначе ничего не произойдет, и вы увидите журнал консоли. Чтобы воспроизвести проблему, запустите скриншот, затем запустите приложение.
Текущий код, который работает со скриншотами:
let jpegData: NSData = outputPhoto.jpegRepresentationWithCompressionQuality(0.9)
let contentEditingOutput = PHContentEditingOutput(contentEditingInput: self.input)
var error: NSError?
let success = jpegData.writeToURL(contentEditingOutput.renderedContentURL, options: NSDataWritingOptions.AtomicWrite, error: &error)
if success {
return contentEditingOutput
} else {
return nil
}
Замена кода, который вызывает скриншоты на провал:
let url = self.input.fullSizeImageURL
let orientation = self.input.fullSizeImageOrientation
var inputImage = CIImage(contentsOfURL: url)
inputImage = inputImage.imageByApplyingOrientation(orientation)
let outputPhoto = createOutputImageFromInputImage(inputImage)!
let originalImageData = NSData(contentsOfURL: self.input.fullSizeImageURL)!
let imageSource = CGImageSourceCreateWithData(originalImageData, nil)
let dataRef = CFDataCreateMutable(nil, 0)
let destination = CGImageDestinationCreateWithData(dataRef, CGImageSourceGetType(imageSource), 1, nil) //getType automatically selects JPG, PNG, etc based on original format
struct ContextStruct {
static var ciContext: CIContext? = nil
}
if ContextStruct.ciContext == nil {
let eaglContext = EAGLContext(API: .OpenGLES2)
ContextStruct.ciContext = CIContext(EAGLContext: eaglContext)
}
let cgImage = ContextStruct.ciContext!.createCGImage(outputPhoto, fromRect: outputPhoto.extent())
CGImageDestinationAddImage(destination, cgImage, nil)
if CGImageDestinationFinalize(destination) {
let contentEditingOutput = PHContentEditingOutput(contentEditingInput: self.input)
var error: NSError?
let imageData: NSData = dataRef
let success = imageData.writeToURL(contentEditingOutput.renderedContentURL, options: .AtomicWrite, error: &error)
if success {
//it does succeed
return contentEditingOutput
} else {
return nil
}
}
Я зарегистрировал ошибку с Apple. Эта ошибка существует и в iOS 9 и 10. Очевидно, что для них не требуется высокий приоритет. – jjxtra