iOS 9 中带有 UIImageView 的 UIImageWriteToSavedPhotosAlbum

Posted

技术标签:

【中文标题】iOS 9 中带有 UIImageView 的 UIImageWriteToSavedPhotosAlbum【英文标题】:UIImageWriteToSavedPhotosAlbum with UIImageView in iOS 9 【发布时间】:2015-09-29 15:33:25 【问题描述】:

我正在尝试在我的应用程序中开发“保存图像”功能,用户可以在其中将 TableView 中的图像保存在他们的照片库中。我在社区中搜索了很多,但找不到与我的案例相关的任何内容,所以我将对其进行解释:

正如官方指南中所说,UIImageWriteToSavedPhotosAlbum 必须接收 UIImage,所以我试图将我的 UIImageView 转换为 UIImage 以实现这一目标,但是当一切正常且没有警告或错误时,APP 正在显示提示“数据不可用”的错误。

我必须做些什么才能让它发挥作用?我是否发送了错误的数据?

<UIImage: 0x16db7780>, 400, 345

这是我的代码:

func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:UnsafePointer<Void>) 

    if error == nil
    
        let ac = UIAlertController(title: "Imagen guardada", message: "", preferredStyle: .Alert)
        ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
        presentViewController(ac, animated: true, completion: nil)
    
    else
    
        let ac = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: .Alert)
        ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
        presentViewController(ac, animated: true, completion: nil)
    



@IBAction func handleGesture(sender: AnyObject) 

    self.votarFrame?.hidden = true

    let guardarMenu = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)

    var img:UIImage!

    img = self.productoImageView.image

    let saveImage = UIAlertAction(title: "Guardar imagen", style: UIAlertActionStyle.Default, handler:  (action) -> Void in
        UIImageWriteToSavedPhotosAlbum(img, self, "image:didFinishSavingWithError:contextInfo:", nil)
    )

    let cancelAction = UIAlertAction(title: "Cancelar", style: UIAlertActionStyle.Cancel, handler: nil)

    guardarMenu.addAction(saveImage)
    guardarMenu.addAction(cancelAction)

    self.presentViewController(guardarMenu, animated: true, completion: nil)

提前致谢。

【问题讨论】:

【参考方案1】:

在致电UIImageWriteToSavedPhotosAlbum 之前,您需要为您的UIImageView 拍摄快照。在UIView 中添加以下扩展名并调用此函数:

func takeSnapshot() -> UIImage 
    UIGraphicsBeginImageContextWithOptions(self.myImageView.bounds.size, false, UIScreen.mainScreen().scale);

    self.drawViewHierarchyInRect(self.myImageView.bounds, afterScreenUpdates: true)
    let image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;

【讨论】:

嗨@Abhinav,我必须把代码放在哪里?提前致谢。 我刚刚删除了它作为扩展,以使您的事情变得简单。将takeSnapshot 函数放在您拥有上述所有代码的同一个视图控制器中,并在调用UIImageWriteToSavedPhotosAlbum 方法之前调用它。确保您的图像视图保存在self.myImageView

以上是关于iOS 9 中带有 UIImageView 的 UIImageWriteToSavedPhotosAlbum的主要内容,如果未能解决你的问题,请参考以下文章

iOS 9.3 中的 UIImageView 如何渲染 UIImage?

IOS中带有静态数组数据的自动完成文本字段

Swift 中带有选择器的协议扩展

UITableViewCell Autolayout问题(iOS 11,Xcode 9.2)

iOS - 触摸 UIImageView 后禁用触摸

iOS:问题保存照片