Kullanıcıların PhotoKit kullanarak fotoğrafları düzenlemelerine izin veren bir uygulama geliştiriyorum. Düzenlenmiş olan fotoğrafı daha önce bir JPEG olarak diske kaydettim. Ben JPEG'e dönüştürmekten kaçınmak ve bunu yapmak için değişiklikleri uygulamaya koymak istiyorum. Fotoğraf makinesiyle çekilen fotoğraflar için harika çalışır, ancak bir ekran görüntüsünü düzenlemeye çalışırsanız, PHPhotoLibrary.sharedPhotoLibrary().performChanges
bloğu başarısız olur ve The operation couldn’t be completed. (Cocoa error -1.)
'u günlüğe kaydeder. Bunun neden performChanges bloğunun başarısız olmasına neden olduğundan emin değilim, neyi yanlış yaptım?Ekran görüntüleri düzenlenemiyor, performChanges bloğu başarısız oluyor
Bu sorunu gösteren bir sample app available to download oluşturdum ve aşağıdaki ilgili kodu ekledim. Uygulama, fotoğraf arşivinizdeki en yeni fotoğrafı düzenlemeye çalışır. Başarılı olursa fotoğrafı düzenlemek için erişim istenir, aksi halde hiçbir şey olmaz ve konsol günlüğünü görürsünüz. Sorunu yeniden oluşturmak için bir ekran görüntüsü alın ve uygulamayı çalıştırın. ekran görüntüleri ile çalışır
Güncel kodu:
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
}
Yedek kod ekran başarısız olmasına neden olur:
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 ile bir hata kaydettim. Bu hata iOS 9 ve 10'da da var. Açıkçası onlar düzeltmek için yüksek bir öncelik değil. – jjxtra