Currently in Objective-C, i use Zbar(http://zbar.sourceforge.net/) to generate & read QR Code. Now, i want to move on Swift development only, is there any 'how to' or library about generate and read QR Code in Swift ?
-
1What's wrong with just using the Zbar library from Swift? – Matt Gibson Sep 24 '14 at 06:34
-
nothing wrong, i just search for Swift langunge base, if exists – tesmojones Sep 24 '14 at 08:33
-
See http://stackoverflow.com/questions/20144071/with-zxing-retiring-for-ios-which-barcode-scanner-to-switch-to/20144677#20144677 – Max MacLeod Nov 06 '14 at 20:39
7 Answers
here is the code i wrote to generate QRcode in swift.
//MARK:- generate QR code
func generateQRImage(stringQR:NSString, withSizeRate rate:CGFloat) -> UIImage
{
var filter:CIFilter = CIFilter(name:"CIQRCodeGenerator")
filter.setDefaults()
var data:NSData = stringQR.dataUsingEncoding(NSUTF8StringEncoding)!
filter.setValue(data, forKey: "inputMessage")
var outputImg:CIImage = filter.outputImage
var context:CIContext = CIContext(options: nil)
var cgimg:CGImageRef = context.createCGImage(outputImg, fromRect: outputImg.extent())
var img:UIImage = UIImage(CGImage: cgimg, scale: 1.0, orientation: UIImageOrientation.Up)!
var width = img.size.width * rate
var height = img.size.height * rate
UIGraphicsBeginImageContext(CGSizeMake(width, height))
var cgContxt:CGContextRef = UIGraphicsGetCurrentContext()
CGContextSetInterpolationQuality(cgContxt, kCGInterpolationNone)
img.drawInRect(CGRectMake(0, 0, width, height))
img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img
}

- 119
- 1
- 2
Beginning with iOS 7, iOS devices can read QR codes. However, there is no built-in way to generate a QR code. Here's a quick and dirty QR code reader.
First, import AVFoundation
and add AVCaptureMetadataOutputObjectsDelegate
Next, setup the capture session:
func captureQRCode() {
let session = AVCaptureSession()
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
let input = AVCaptureDeviceInput.deviceInputWithDevice(device, error: nil) as AVCaptureDeviceInput
session.addInput(input)
let output = AVCaptureMetadataOutput()
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
session.addOutput(output)
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
let bounds = self.view.layer.bounds
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.bounds = bounds
previewLayer.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))
self.view.layer.addSublayer(previewLayer)
session.startRunning()
}
Finally, handle the delegate
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
for item in metadataObjects {
if let metadataObject = item as? AVMetadataMachineReadableCodeObject {
if metadataObject.type == AVMetadataObjectTypeQRCode {
println("QR Code: \(metadataObject.stringValue)")
}
}
}
}

- 2,701
- 1
- 17
- 22
Here is the code I wrote to generate QRcode in objective-C:
#pragma mark - qrimage
-(UIImage *)generateQRimg:(NSString *)a withsize:(CGFloat)b
{
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
[filter setDefaults];
NSData *data = [a dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKey:@"inputMessage"];
CIImage *outputImage = [filter outputImage];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [context createCGImage:outputImage
fromRect:[outputImage extent]];
UIImage *image = [UIImage imageWithCGImage:cgImage
scale:1.
orientation:UIImageOrientationUp];
// Resize without interpolating
UIImage *resized = [self resizeImage:image
withQuality:kCGInterpolationNone
rate:b];
CGImageRelease(cgImage);
return resized;
}
- (UIImage *)resizeImage:(UIImage *)image withQuality (CGInterpolationQuality)quality rate:(CGFloat)rate
{
UIImage *resized = nil;
CGFloat width = image.size.width * rate;
CGFloat height = image.size.height * rate;
UIGraphicsBeginImageContext(CGSizeMake(width, height));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, quality);
[image drawInRect:CGRectMake(0, 0, width, height)];
resized = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resized;
}
-
@tesmojones check the comment under here is the code i wrote to generate QRcode in swift. – kui liu Apr 02 '15 at 07:28
This GitHub project provides some code on how to generate a QR code:
https://github.com/aschuch/QRCode
// NSData
let data = "http://schuch.me".dataUsingEncoding(NSISOLatin1StringEncoding)
let qrCode = QRCode(data)
qrCode.image
As for reading, there is another good GitHub project here:
https://github.com/yannickl/QRCodeReader.swift
// Good practice: create the reader lazily to avoid cpu overload during the
// initialization and each time we need to scan a QRCode
lazy var reader = QRCodeReaderViewController(metadataObjectTypes: [AVMetadataObjectTypeQRCode])
@IBAction func scanAction(sender: AnyObject) {
// Retrieve the QRCode content
// By using the delegate pattern
reader.delegate = self
// Or by using the closure pattern
reader.completionBlock = { (result: String?) in
println(result)
}
// Presents the reader as modal form sheet
reader.modalPresentationStyle = .FormSheet
presentViewController(reader, animated: true, completion: nil)
}
// MARK: - QRCodeReader Delegate Methods
func reader(reader: QRCodeReader, didScanResult result: String) {
self.dismissViewControllerAnimated(true, completion: nil)
}
func readerDidCancel(reader: QRCodeReader) {
self.dismissViewControllerAnimated(true, completion: nil)
}
I suggest you check out these two projects and combine the code to make your desired behaviour.

- 779
- 10
- 21
QR Code Generator in Swift :
in viewDidLoad
:
var qrcodeImage: CIImage!
@IBOutlet var qrtext: UITextField!
@IBOutlet var imgQRCode: UIImageView!
@IBAction func displayQRcode(sender: AnyObject) {
if qrcodeImage == nil {
if qrtext.text == "" {
return
}
let data = qrtext.text!.dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: false)
let filter = CIFilter(name: "CIQRCodeGenerator")
filter!.setValue(data, forKey: "inputMessage")
filter!.setValue("Q", forKey: "inputCorrectionLevel")
qrcodeImage = filter!.outputImage
qrtext.resignFirstResponder()
displayQRCodeImage()
}
else {
self.imgQRCode.image = nil
self.qrcodeImage = nil
}
}
func displayQRCodeImage() {
let scaleX = imgQRCode.frame.size.width / qrcodeImage.extent.size.width
let scaleY = imgQRCode.frame.size.height / qrcodeImage.extent.size.height
let transformedImage = qrcodeImage.imageByApplyingTransform(CGAffineTransformMakeScale(scaleX, scaleY))
imgQRCode.image = UIImage(CIImage: transformedImage)
}
And For QRCode Reader
please check this Tutorial http://www.appcoda.com/qr-code-reader-swift/

- 3,043
- 2
- 32
- 52

- 163
- 1
- 7
SWIFT 3: QR Code Reader
STEP FIRST: Simply add a row in info.plist and type Privacy - CameraUsageDescription into the newly created row and add a string meant for informing the user on why access to the camera is needed within your app.
STEP SECOND: Use this code in your ViewController class
class QrCodeScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
var calssName:String = "QrCodeScannerViewController"
var captureSession:AVCaptureSession?
var videoPreviewLayer:AVCaptureVideoPreviewLayer?
var qrCodeFrameView:UIView?
@IBOutlet weak var messageLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
captureQRCode()
}
/* Open camera to capture QR CODE */
func captureQRCode() {
captureSession = AVCaptureSession()
let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
let input = try! AVCaptureDeviceInput(device: device) as AVCaptureDeviceInput
captureSession?.addInput(input)
let output = AVCaptureMetadataOutput()
output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
captureSession?.addOutput(output)
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
let bounds = self.view.layer.bounds
videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
videoPreviewLayer?.bounds = bounds
videoPreviewLayer?.position = CGPoint(x:bounds.midX, y:bounds.midY)
self.view.layer.addSublayer(videoPreviewLayer!)
captureSession?.startRunning()
}
/* onAtivityResult from App Delegate */
func captureOutput(_ captureOutput: AVCaptureOutput!,
didOutputMetadataObjects metadataObjects: [Any]!,
from connection: AVCaptureConnection!) {
for item in metadataObjects {
if let metadataObject = item as? AVMetadataMachineReadableCodeObject {
if metadataObject.type == AVMetadataObjectTypeQRCode {
print("QR Code: \(metadataObject.stringValue)")
hideCamera(voucherHashkey: metadataObject.stringValue)
}
}
}
}
/* Hide camera after getting result */
func hideCamera(voucherHashkey:String){
self.captureSession?.stopRunning()
self.videoPreviewLayer?.removeFromSuperlayer()
self.videoPreviewLayer = nil;
self.captureSession = nil;
// sendVocherDataToServer(voucherHashKey: voucherHashkey)
}
}

- 6,441
- 16
- 63
- 99
A less quick and dirty Swift implementation of a QR code reader, taking into account the fact that AVCaptureSession
's startRunning()
is a blocking call and other details, can be found here:
https://bitbucket.org/snippets/stefanpilger/gE98R/qr-code-reader-class-swift

- 1,347
- 2
- 16
- 38