根据项目的需求,所以这里主要介绍一下由链接生成的二维码,长按二维码,截取二维码部分保存到本地相册中。
最初我想用UIImageWriteToSavedPhotosAlbum
方法直接把生成的二维码存入相册中,但是发现保存失败,感觉应该是类型问题出的错,所以我用了截屏的方法。
override func viewWillAppear(animated: Bool) {
qrCodeImageView.image = createQRForString(url,qrImageName: "QRCoreImage")
}
//创建二维码图片
func createQRForString(qrString: String?, qrImageName: String?) -> UIImage?{
let stringData = sureQRString.dataUsingEncoding(NSUTF8StringEncoding,
allowLossyConversion: false)
// 创建一个二维码的滤镜
let qrFilter = CIFilter(name: "CIQRCodeGenerator")!
qrFilter.setValue(stringData, forKey: "inputMessage")
qrFilter.setValue("H", forKey: "inputCorrectionLevel")
let qrCIImage = qrFilter.outputImage
// 创建一个颜色滤镜,黑白色
let colorFilter = CIFilter(name: "CIFalseColor")!
colorFilter.setDefaults()
colorFilter.setValue(qrCIImage, forKey: "inputImage")
colorFilter.setValue(CIColor(red: 0, green: 0, blue: 0), forKey: "inputColor0")
colorFilter.setValue(CIColor(red: 1, green: 1, blue: 1), forKey: "inputColor1")
// 返回二维码image
let codeImage = UIImage(CIImage: colorFilter.outputImage!
// 下面是将头像之类的图片放到二维码中
// if let iconImage = UIImage(named: qrImageName!) {
// let rect = CGRectMake(0, 0, codeImage.size.width, codeImage.size.height)
// UIGraphicsBeginImageContext(rect.size)
//
// codeImage.drawInRect(rect)
// let avatarSize = CGSizeMake(rect.size.width * 0.25, rect.size.height * 0.25)
// let x = (rect.width - avatarSize.width) * 0.5
// let y = (rect.height - avatarSize.height) * 0.5
// iconImage.drawInRect(CGRectMake(x, y, avatarSize.width, avatarSize.height))
// let resultImage = UIGraphicsGetImageFromCurrentImageContext()
//
// UIGraphicsEndImageContext()
// return resultImage
// }
return codeImage
}
return nil
}
override func viewDidLoad() {
super.viewDidLoad()
//添加长按事件
let upKeyGesture = UILongPressGestureRecognizer()
upKeyGesture.addTarget(self, action: "qrCodeButtonClicked:")
qrCodeButton.addGestureRecognizer(upKeyGesture)
}
//长按事件
func qrCodeButtonClicked(sender: UILongPressGestureRecognizer) {
if sender.state == UIGestureRecognizerState.Began{
// 开始截取二维码部分(设置截取大小)
UIGraphicsBeginImageContext(qrCodeImageView.bounds.size)
// 获得截取到的图像
let img : UIImage = UIGraphicsGetImageFromCurrentImageContext()
// 结束截取
UIGraphicsEndImageContext()
//将图片保存到本地
UIImageWriteToSavedPhotosAlbum(img, self, "image:didFinishSavingWithError:contextInfo:", nil)
}else if sender.state == UIGestureRecognizerState.Ended{
return
}
}
func image(image:UIImage,didFinishSavingWithError error:NSError?,contextInfo:AnyObject) {
if error != nil {
UIhelper.showToast("保存失败", view: self.view)
} else {
UIhelper.showToast("保存成功", view: self.view)
}
}
最后要注意的是,我在开始的时候,保存二维码,在本地相册中会同时保存两张,后来发现是长按方法执行了两次,所以进行了UIGestureRecognizerState的判断。