2014-09-24 9 views
7

Attualmente in Objective-C, uso Zbar (http://zbar.sourceforge.net/) per generare & leggere il codice QR. Ora, voglio passare solo allo sviluppo di Swift, c'è qualche "how to" o libreria su come generare e leggere il codice QR in Swift?QR Code reader & generator in Swift

+1

Cosa c'è di sbagliato con solo utilizzando la libreria Zbar da Swift? –

+0

niente di male, cerco solo la base Swift langunge, se esiste – tesmojones

+0

Vedi http://stackoverflow.com/questions/20144071/with-zxing-retiring-for-ios-which-barcode-scanner-to-switch-to/ 20144677 # 20144677 –

risposta

6

A partire da iOS 7, i dispositivi iOS possono leggere i codici QR. Tuttavia, non esiste un modo integrato per generare un codice QR. Ecco un lettore di codici QR veloce e sporco.

In primo luogo, import AVFoundation e aggiungere AVCaptureMetadataOutputObjectsDelegate

Successivamente, configurare la sessione di cattura:

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() 
} 

Infine, gestire il delegato

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)") 
      } 
     } 
    } 
} 
6

qui è il codice che ho scritto per generare 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 
} 
0

Ecco il codice che ho scritto per generare 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; 
} 
+1

si prega di fornire in codice rapido – tesmojones

+0

@tesmojones controllare il commento qui sotto è il codice che ho scritto per generare QRcode in rapido. –

1

Questo pro GitHub Ject fornisce un certo codice su come generare un codice QR:

https://github.com/aschuch/QRCode

// NSData 
let data = "http://schuch.me".dataUsingEncoding(NSISOLatin1StringEncoding) 
let qrCode = QRCode(data) 
qrCode.image 

Per quanto riguarda la lettura, v'è un altro buon progetto GitHub qui:

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) 
} 

Suggerisco dai un'occhiata a questi due progetti e combina il codice per rendere il tuo comportamento desiderato.

1

QR Code Generator a 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) 
} 

E per QRCode Reader

prega di consultare questo tutorial http://www.appcoda.com/qr-code-reader-swift/

0

SWIFT 3:QR Code Reader

primo gradino: Basta aggiungere una riga in informazioni.plist e digitare Privacy - CameraUsageDescription nella riga appena creata e aggiungere una stringa intesa per informare l'utente sul motivo per cui l'accesso alla videocamera è necessario all'interno dell'app.

PASSO SECONDO: utilizzare questo codice nella classe ViewController

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) 

} 
}