Я использую CGImageDestinationCreateWithURL для сохранения изображения в формате gif, вот код, который у меня есть:
func gifFromImages(images: Array<UIImage>, animationTime: Double) -> String? {
let date = Int(NSDate().timeIntervalSince1970)
let path = Bundle.main.bundlePath + "/gifs/" + String(date) + ".gif"
let delay = animationTime / Double(totalFrames)
let prep = [kCGImagePropertyGIFDictionary as String :
[kCGImagePropertyGIFDelayTime as String : delay]] as CFDictionary
let fileProperties = [ kCGImagePropertyGIFDictionary as String :
[kCGImagePropertyGIFLoopCount as String : 0] ,
kCGImageMetadataShouldExcludeGPS as String: true]
as CFDictionary
let url = URL(fileURLWithPath: path) as CFURL
guard let destination = CGImageDestinationCreateWithURL(url, kUTTypeGIF,
images.count, nil) else {
return nil
}
CGImageDestinationSetProperties(destination, fileProperties)
for image in images {
if let cgImage = image.cgImage {
CGImageDestinationAddImage(destination, cgImage, prep)
}
}
if CGImageDestinationFinalize(destination) {
return path
}
return nil
}
Проблема, с которой я сталкиваюсь, заключается в том, что когда я пробую этот код на симуляторе, он работает нормально и создает нужный мне файл, но когда я запускаю его на устройстве, CGImageDestinationCreateWithURL возвращает nil. Моя первая мысль заключается в том, что путь к файлу неправильный, я посмотрел в Интернете и пытаюсь использовать следующие пути / URL-адреса:
let path = Bundle.main.bundlePath + "/gifs/" + String(date) + ".gif"
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last!.appending("/gifs/\(String(date)).gif")
let path = NSString(string: "~/gifs/\(String(date)).gif").expandingTildeInPath
let url = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) as CFURL
И когда я попытался использовать URL-адрес (строка: путь) вместо URL-адреса (файлURLWithPath:), я получил следующую ошибку:
: CGDataConsumer(url_close): ошибка записи.
Любые идеи о том, что может происходить? Какой путь я должен использовать?