首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 3通过电子邮件发送PHAsset图像

Swift 3通过电子邮件发送PHAsset图像
EN

Stack Overflow用户
提问于 2017-10-26 22:55:48
回答 1查看 498关注 0票数 1

我试图通过电子邮件发送一个PHAsset图像。我首先尝试在一个沙箱应用程序中获得一个基本案例,然后我想最终迭代一个PHAssets数组。下面是我的沙箱代码,然后是几个问题。(其中一些代码片段来自这是如此的帖子。)这都是为了实现我发现的名为TLPHAssets的多资产选择器,它看起来是这张名单在另一篇文章上最新版本的Swift-4 / PHAsset。

代码语言:javascript
复制
func dismissPhotoPicker(withTLPHAssets: [TLPHAsset]) {
    // use selected order, fullresolution image

    self.selectedAssets = withTLPHAssets

    let mail = MFMailComposeViewController()
    mail.mailComposeDelegate = self;
    mail.setToRecipients(["emailaddress.com"])
    // Put the rest of the email together and present the draft to the user
    mail.setSubject("Subject")

    let options = PHImageRequestOptions()
    options.isNetworkAccessAllowed = true
    options.version = .current
    options.deliveryMode = .opportunistic
    options.resizeMode = .fast
    let asset : PHAsset = self.selectedAssets[0].phAsset! as PHAsset
    PHImageManager.default().requestImage(for: asset, targetSize: CGSize(width : 400, height : 400), contentMode: .aspectFit, options: options, resultHandler: {(result: UIImage!, info) in
        if let image = result
        {
            let imageData: NSData = UIImageJPEGRepresentation(image, 1.0)! as NSData
            mail.addAttachmentData(imageData as Data, mimeType: "image/jpg", fileName: "BeforePhoto.jpg")
        }
    })

有两个问题(我对斯威夫特来说是个新手,所以如果我错过了一些基本的问题,很抱歉):

  1. 我很难让resultHandler代码块被执行。我将targetSize设置为PHImageManagerMaximumSize,但后来根据另一篇文章的建议将其更改为400x400 (顺便说一句,我只是从相机卷中选择了一张图像,我在测试案例中确认,PHAsset的mediaType是“图像”;目前还没有使用Live或PHAsset,尽管我计划接下来处理这些问题,我将添加一个开关语句,以确保调用正确的资产--request)。为什么PHImageManagerMaximumSize不能工作?当我在仿真器中运行这个应用程序并选择五幅罐头图像中的一幅时,我仍然无法进入resultHandler代码块(这些都是mediaType的“图像”)。知道我的requestImage调用有什么问题吗?它阻止了resultHandler的调用?
  2. 我最终从我的相机卷中得到了一幅图像,使resultHandler代码在400x400的targetSize上被调用。但是现在在resultHandler里面,我的沙箱应用程序在“让imageData: NSData .”上崩溃。一行"2017-10-26 15:35:26.604997-0700 MultiAssetPicker15766 15766:4904592致命错误:意外发现为零,而展开一个可选值“。

任何和所有的帮助都非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2017-11-06 17:24:27

我想通了。关键是将isSynchronous设置为PHImageRequestOptions中的true。下面是帮助我解决这些问题的最新代码,尽管我还不认为它是生产(需要更多的测试)。

代码语言:javascript
复制
                    // Set up the image-request options
                    let options = PHImageRequestOptions()
                    options.isNetworkAccessAllowed = true
                    options.version = .current
                    options.deliveryMode = .opportunistic
                    options.isSynchronous = true
                    options.resizeMode = .fast

                    // For each photo asset the user selected
                    for i in 0..<self.selectedAssets.count {

                        // Convert to a PHAsset
                        let asset : PHAsset = self.selectedAssets[i].phAsset! as PHAsset

                        // Request the underlying asset as an image
                        PHImageManager.default().requestImage(for: asset, targetSize: CGSize(width : 400, height : 400), contentMode: .aspectFill, options: options, resultHandler: {(result: UIImage!, info) in

                            // If the asset is in fact an image, attach it to the email being composed
                            switch self.selectedAssets[i].phAsset?.mediaType {
                            case .image?:
                                print("Image \(i)")
                                let imageData: NSData = UIImageJPEGRepresentation(result!, 0.9)! as NSData
                                mail.addAttachmentData(imageData as Data, mimeType: "image/jpg", fileName: "Attachment\(i).jpg")
                            case .video?:
                                print("Video not supported.")
                            case .audio?:
                                print("Audio not supported")
                            default:
                                print("Unknown")
                            }
                        })
                    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46965052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档