通过 AirDrop 发送即时创建的 QR 码 UIImage 失败
Sending an on-the-fly created QR Code UIImage by AirDrop fails
我正在动态创建二维码并将其存储为 UIImage。现在我希望能够使用 UIActivityViewController 发送它,但不知何故它失败了:
func generateQRCode(from string: String) -> UIImage? {
let data = string.data(using: String.Encoding.ascii)
if let filter = CIFilter(name: "CIQRCodeGenerator") {
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: 3, y: 3)
if let output = filter.outputImage?.applying(transform) {
return UIImage(ciImage: output)
}
}
return nil
}
然后我调用该函数并将其存储为 UIImage:
let image = generateQRCode(from: "Create my Code")
imgQRCode.image = image
导出按钮使用以下操作:
@IBAction func shareButtonClicked(sender: UIButton) {
let objectsToShare = [imgQRCode.image!] as [AnyObject]
let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
activityVC.popoverPresentationController?.sourceView = sender
self.present(activityVC, animated: true, completion: nil)
}
选择通过 AirDrop 发送到我的 Mac 后,应用程序崩溃了
2016-11-05 23:29:15.912242 Ordnung[3945:888442] CGContextScaleCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
11 月 5 日 23:29:15 命令 [3945]:CGContextScaleCTM:上下文 0x0 无效。如果要查看回溯,请设置 CG_CONTEXT_SHOW_BACKTRACE 环境变量。
2016-11-05 23:29:15.912396 Ordnung[3945:888442] CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
Nov 5 23:29:15 Ordnung[3945] <Error>: CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2016-11-05 23:29:15.912584 Ordnung[3945:888442] CGContextConcatCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
Nov 5 23:29:15 Ordnung[3945] <Error>: CGContextConcatCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2016-11-05 23:29:15.912692 Ordnung[3945:888442] CGContextDrawImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
Nov 5 23:29:15 Ordnung[3945] <Error>: CGContextDrawImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2016-11-05 23:29:15.927580 Ordnung[3945:888442] [AirDrop] Sender kSFOperationEventErrorOccured {
Error = "Error Domain=SFOperation Code=-5 \"Die \U00dcbertragung ist fehlgeschlagen, da du eine ung\U00fcltige Datei senden wolltest.\" UserInfo={NSLocalizedDescription=Die \U00dcbertragung ist fehlgeschlagen, da du eine ung\U00fcltige Datei senden wolltest.}";
SessionID = 76FBE80074FC;
}
有人知道如何完成这项工作吗?
麦克干杯
看来我需要以稍微不同的方式提供图像,因此通过在创建 UIImage 之前创建 CGImage 以这种方式更改 QR 码生成来解决问题:
func generateQRCode(from string: String) -> UIImage? {
let ciContext = CIContext()
let data = string.data(using: String.Encoding.ascii)
if let filter = CIFilter(name: "CIQRCodeGenerator") {
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: 3, y: 3)
let upScaledImage = filter.outputImage?.applying(transform)
let cgImage = ciContext.createCGImage(upScaledImage!,
from: upScaledImage!.extent)
let qrcodeImage = UIImage(cgImage: cgImage!)
return qrcodeImage
}
return nil
}
为Swift4.2
func generateQRCode(from string: String) -> UIImage? {
let ciContext = CIContext()
let data = string.data(using: String.Encoding.ascii)
if let filter = CIFilter(name: "CIQRCodeGenerator") {
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: 3, y: 3)
let upScaledImage = filter.outputImage?.transformed(by: transform)
let cgImage = ciContext.createCGImage(upScaledImage!, from: upScaledImage!.extent)
let qrcodeImage = UIImage(cgImage: cgImage!)
return qrcodeImage
}
return nil
}
此外,您应该使用 png 或 jpg 图像表示法:
func share() {
let png = UIImagePNGRepresentation(qrcodeImage)
let vc = UIActivityViewController(activityItems: [png!], applicationActivities: [])
present(vc, animated: true)
}
我正在动态创建二维码并将其存储为 UIImage。现在我希望能够使用 UIActivityViewController 发送它,但不知何故它失败了:
func generateQRCode(from string: String) -> UIImage? {
let data = string.data(using: String.Encoding.ascii)
if let filter = CIFilter(name: "CIQRCodeGenerator") {
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: 3, y: 3)
if let output = filter.outputImage?.applying(transform) {
return UIImage(ciImage: output)
}
}
return nil
}
然后我调用该函数并将其存储为 UIImage:
let image = generateQRCode(from: "Create my Code")
imgQRCode.image = image
导出按钮使用以下操作:
@IBAction func shareButtonClicked(sender: UIButton) {
let objectsToShare = [imgQRCode.image!] as [AnyObject]
let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
activityVC.popoverPresentationController?.sourceView = sender
self.present(activityVC, animated: true, completion: nil)
}
选择通过 AirDrop 发送到我的 Mac 后,应用程序崩溃了
2016-11-05 23:29:15.912242 Ordnung[3945:888442] CGContextScaleCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
11 月 5 日 23:29:15 命令 [3945]:CGContextScaleCTM:上下文 0x0 无效。如果要查看回溯,请设置 CG_CONTEXT_SHOW_BACKTRACE 环境变量。
2016-11-05 23:29:15.912396 Ordnung[3945:888442] CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
Nov 5 23:29:15 Ordnung[3945] <Error>: CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2016-11-05 23:29:15.912584 Ordnung[3945:888442] CGContextConcatCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
Nov 5 23:29:15 Ordnung[3945] <Error>: CGContextConcatCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2016-11-05 23:29:15.912692 Ordnung[3945:888442] CGContextDrawImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
Nov 5 23:29:15 Ordnung[3945] <Error>: CGContextDrawImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2016-11-05 23:29:15.927580 Ordnung[3945:888442] [AirDrop] Sender kSFOperationEventErrorOccured {
Error = "Error Domain=SFOperation Code=-5 \"Die \U00dcbertragung ist fehlgeschlagen, da du eine ung\U00fcltige Datei senden wolltest.\" UserInfo={NSLocalizedDescription=Die \U00dcbertragung ist fehlgeschlagen, da du eine ung\U00fcltige Datei senden wolltest.}";
SessionID = 76FBE80074FC;
}
有人知道如何完成这项工作吗?
麦克干杯
看来我需要以稍微不同的方式提供图像,因此通过在创建 UIImage 之前创建 CGImage 以这种方式更改 QR 码生成来解决问题:
func generateQRCode(from string: String) -> UIImage? {
let ciContext = CIContext()
let data = string.data(using: String.Encoding.ascii)
if let filter = CIFilter(name: "CIQRCodeGenerator") {
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: 3, y: 3)
let upScaledImage = filter.outputImage?.applying(transform)
let cgImage = ciContext.createCGImage(upScaledImage!,
from: upScaledImage!.extent)
let qrcodeImage = UIImage(cgImage: cgImage!)
return qrcodeImage
}
return nil
}
为Swift4.2
func generateQRCode(from string: String) -> UIImage? {
let ciContext = CIContext()
let data = string.data(using: String.Encoding.ascii)
if let filter = CIFilter(name: "CIQRCodeGenerator") {
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: 3, y: 3)
let upScaledImage = filter.outputImage?.transformed(by: transform)
let cgImage = ciContext.createCGImage(upScaledImage!, from: upScaledImage!.extent)
let qrcodeImage = UIImage(cgImage: cgImage!)
return qrcodeImage
}
return nil
}
此外,您应该使用 png 或 jpg 图像表示法:
func share() {
let png = UIImagePNGRepresentation(qrcodeImage)
let vc = UIActivityViewController(activityItems: [png!], applicationActivities: [])
present(vc, animated: true)
}