问题描述
我有一个图像视图图像。我正在打开 Giphy SDK 底部工作表以在已添加的图像上添加 gif。
private func createGifView(url: String?) {
let x = CGFloat.random(in: 0...(parentView.frame.width - 80))
let y = CGFloat.random(in: 0...(parentView.frame.height - 80))
let imageView = SDAnimatedImageView(frame: CGRect(x: x,y: y,width: 120,height: 120))
imageView.isUserInteractionEnabled = true
if let url = url {
imageView.sd_setimage(with: URL(string: url),completed: nil)
}
let panGesture = UIPanGestureRecognizer(target: self,action: #selector(emojiDidMove))
let pinchGesture = UIPinchGestureRecognizer(target: self,action: #selector(emojiDidPinch))
let rotationGesture = UIRotationGestureRecognizer(target: self,action: #selector(emojiDidRotate))
panGesture.delegate = self
pinchGesture.delegate = self
rotationGesture.delegate = self
imageView.addGestureRecognizer(panGesture)
imageView.addGestureRecognizer(pinchGesture)
imageView.addGestureRecognizer(rotationGesture)
parentView.addSubview(imageView)
guard let rightBarButtonItems = navigationItem.rightBarButtonItems else { return }
rightBarButtonItems[1].isEnabled = true
}
private func saveEmojiAddedImage() -> UIImage {
UIGraphicsBeginImageContext(parentView.frame.size)
parentView.layer.render(in: UIGraphicsGetCurrentContext()!)
guard let image = UIGraphicsGetimageFromCurrentimageContext() else { return UIImage(named: "smile")! }
let imageView = SDAnimatedImageView()
let animatedImage = SDAnimatedImage(named: "image.gif")
imageView.image = animatedImage
imageView.image = image
let imageData = imageView.image?.sd_imageData(as: .GIF)
if let data = imageData {
PHPhotoLibrary.shared().performChanges({
PHAssetCreationRequest.forAsset().addResource(with: .photo,data: data,options: nil)
}) { success,error in
guard success else {
print("Failed to save gif \(error?.localizedDescription)")
return
}
print("successfully saved gif")
}
}
UIGraphicsEndImageContext()
let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: [image],applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view
self.present(activityViewController,animated: true,completion: nil)
return image
}
extension MainViewController: GiphyDelegate {
func didSelectMedia(giphyViewController: GiphyViewController,media: GPHMedia) {
let url = media.url(rendition: .fixedWidth,fileType: .gif)
createGifView(url: url)
}
}
解决方法
我解决了使用 Timer 截取 25 张 gif 添加图像视图的屏幕截图的问题。我将这25张截图添加到UIImage数组中并转换为视频,最后保存到照片库中作为视频。
class MainViewController: UIViewController {
private var gifImages: [UIImage] = []
private var gifTimer: Timer?
UIBarButtonItem(barButtonSystemItem: .save,target: self,action: #selector(fireTimer))
@objc func fireTimer() {
scheduledTimerWithTimeInterval()
}
private func scheduledTimerWithTimeInterval(){
gifTimer = Timer.scheduledTimer(timeInterval: 1.0,selector: #selector(saveEmojiAddedImage),userInfo: nil,repeats: true)
}
//MARK: - SaveEmojiAddedImage
//Final Image
@objc private func saveEmojiAddedImage() {
UIGraphicsBeginImageContextWithOptions(parentView.frame.size,true,0.0)
parentView.drawHierarchy(in: parentView.bounds,afterScreenUpdates: true) guard let image = UIGraphicsGetImageFromCurrentImageContext() else { return }
UIGraphicsEndImageContext()
if isGIFAdded {
self.gifImages.append(image)
indicator.startAnimating()
view.isUserInteractionEnabled = false
print("Gif Images Count: \(gifImages.count)")
if gifImages.count == 25 {
self.stopTimer()
indicator.stopAnimating()
view.isUserInteractionEnabled = true
}
}
}
func stopTimer() {
if gifTimer != nil {
gifTimer!.invalidate()
gifTimer = nil
DispatchQueue.global(qos: .background).async {
DispatchQueue.main.async {
self.createVideo()
}
}
}
}
使用 imageview 的 25 个屏幕截图创建视频
func createVideo() {
let settings = CXEImagesToVideo.videoSettings(codec: AVVideoCodecType.h264.rawValue,width: (gifImages[0].cgImage?.width)!,height: (gifImages[0].cgImage?.height)!)
let movieMaker = CXEImagesToVideo(videoSettings: settings)
movieMaker.createMovieFrom(images: gifImages){ (fileURL:URL) in
if self.isSaveVideo {
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: fileURL)
}) { saved,error in
self.gifImages.removeAll()
if saved {
self.gifImages.removeAll()
DispatchQueue.main.async {
self.presentAlert(withTitle: "Successful",message: "GIF saved successfully")
}
} else {
DispatchQueue.main.async {
self.presentAlert(withTitle: "Error",message: "")
}
}
}
} else {
self.gifImages.removeAll()
self.videoFileURL = fileURL
}
}
}
}