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
risposta
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)")
}
}
}
}
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
}
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;
}
si prega di fornire in codice rapido – tesmojones
@tesmojones controllare il commento qui sotto è il codice che ho scritto per generare QRcode in rapido. –
A meno rapido e sporco Swift implementazione di un lettore di codice a barre, tenendo conto del fatto che AVCaptureSession
's startRunning()
è una chiamata di blocco e altri dettagli, può essere trovato qui:
https://bitbucket.org/snippets/stefanpilger/gE98R/qr-code-reader-class-swift
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.
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/
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)
}
}
- 1. C# code generator
- 2. QR code Limiti
- 3. C++ XML Schema Code Generator
- 4. Javascript QR code reading libraries
- 5. Come decodificare un'immagine QR-code in Python (preferibilmente puro)?
- 6. Come integrare OAuth2.0 con OData Client Code Generator?
- 7. Android/QR-Code: è possibile aprire direttamente Google Play Store utilizzando un codice QR?
- 8. Condividi WiFi-Settings come QR-Code per WPA2 Enterprise
- 9. Pagina Facebook URL "simile" automatico (per QR Code)
- 10. Java code to swift converter
- 11. Combination Generator in Linq
- 12. scalacheck case class data generator generator
- 13. BarCode Image Generator in Java
- 14. più voti in Reader
- 15. CSS to png generator
- 16. C# API generator
- 17. Crappy Random Number Generator
- 18. PHP Zend Framework Generator
- 19. Fast Random Generator
- 20. Entity generator from database
- 21. Python Reverse Generator
- 22. Python Fibonacci Generator
- 23. DAO generator for java
- 24. junit test case generator
- 25. Express Generator Without Jade
- 26. MvcBuildViews Versus Razor Generator
- 27. [iPhone - iOS] Ho bisogno dell'API Reader QRCode per iPhone
- 28. Generazione di un codice QR in rotaie
- 29. Python prime generator in one-line
- 30. iPhone QRCode Generator n Decoder
Cosa c'è di sbagliato con solo utilizzando la libreria Zbar da Swift? –
niente di male, cerco solo la base Swift langunge, se esiste – tesmojones
Vedi http://stackoverflow.com/questions/20144071/with-zxing-retiring-for-ios-which-barcode-scanner-to-switch-to/ 20144677 # 20144677 –