2014-09-22 18 views
9

Ho la mia app integrata con ZBar. Funziona perfettamente in iOS 7.1 e versioni precedenti, ma nei dispositivi iOS 8.0 trovo che la vista della videocamera sia inizialmente mostrata in nero. Tuttavia, se invio l'app allo stato di background e la invio nuovamente in primo piano, avendo la vista della telecamera aperta, funziona. Qualcuno ha provato questo?ZBar SDK e fotocamera non funzionano correttamente su iOS 8

Grazie

+0

Uno dei miei utenti ha riscontrato lo stesso problema su iphone 6. Hai presentato una segnalazione di bug agli sviluppatori di ZBar? – nanako

+0

ZBar utilizza un codice a 32 bit e nessuno li ha ancora portati a 64 bit. Ecco il codice sorgente - l'ultimo commit è stato 2 anni fa - https://github.com/ZBar/ZBar. Funziona bene su IOS 6. Ho questo problema da solo e sto cercando un SDK sostitutivo - il più vicino SDK gratuito di terze parti è ZXING ma hanno anche problemi con 64 bit, fino a quando gli SDK di terze parti non vengono portati il ​​più fattibile l'opzione è quella incorporata con IOS (vedi sotto) che ti darà la possibilità di scansionare codici QR e come bonus PDF417 e codici Aztec tuttavia - il supporto per la scansione 1D codice a barre (UPC, CODE128, ecc.) non è presente – Paulo

+0

ho appena provato questa versione di Zing in IOS 8 - sembra funzionare - https://github.com/TheLevelUp/ZXingObjC – Paulo

risposta

0

Se avete solo bisogno di scansione dei codici a barre, è molto più facile per fare questo con mezzi nativi:

Nel .h del VC aggiungono:

#import <AVFoundation/AVFoundation.h> 
@interface FEQRViewController : UIViewController <AVCaptureMetadataOutputObjectsDelegate> 

E in. m

@interface FEQRViewController() 

@property (nonatomic) BOOL isReading; 

@property (nonatomic, strong) AVCaptureSession *captureSession; 
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer; 

-(BOOL)startReading; 

-(void)stopReading; 

@end 

@implementation FEQRViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.view.backgroundColor = ....; 


    self.isReading = NO; 
    self.captureSession = nil; 


    // Do any additional setup after loading the view from its nib. 
} 

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    if (!self.isReading) { 
     if ([self startReading]) { 
      //[self.startButton setTitle:@"Stop" forState:UIControlStateNormal]; 
      [self.statusLabel setText:@"Scanning for QR Code..." ]; 
     } 
    } 
    else{ 
     [self stopReading]; 
     [self.startButton setTitle:@"Start!" forState:UIControlStateNormal]; 
    } 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 


-(BOOL)startReading 
{ 
    NSError *error; 
    AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; 

    if (!input) { 
     NSLog(@"%@", [error localizedDescription]); 
     return NO; 
    } 

    self.captureSession = [[AVCaptureSession alloc] init]; 
    [self.captureSession addInput:input]; 

    AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init]; 
    [self.captureSession addOutput:captureMetadataOutput]; 

    dispatch_queue_t dispatchQueue; 
    dispatchQueue = dispatch_queue_create("myQueue", NULL); 
    [captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue]; 
    [captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]]; 

    self.videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession]; 
    [self.videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 
    [self.videoPreviewLayer setFrame:self.preview.layer.bounds]; 
    [self.preview.layer addSublayer:_videoPreviewLayer]; 

    [_captureSession startRunning]; 
    return YES; 
} 

-(void)stopReading 
{ 
    [self.captureSession stopRunning]; 

    self.captureSession = nil; 
    [self.videoPreviewLayer removeFromSuperlayer]; 

} 


-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ 
    if (metadataObjects != nil && [metadataObjects count] > 0) { 

     AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0]; 
     if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) { 
      [self.statusLabel performSelectorOnMainThread:@selector(setText:) withObject:[metadataObj stringValue] waitUntilDone:NO]; 
      NSURL *url = [NSURL URLWithString:[metadataObj stringValue]]; 
      if (url) 

       [self performSelectorOnMainThread:@selector(goToURL:) withObject:url waitUntilDone:NO]; 

      [self performSelectorOnMainThread:@selector(stopReading) withObject:nil waitUntilDone:NO]; 
      //[self.startButton performSelectorOnMainThread:@selector(setTitle:) withObject:@"Start!" waitUntilDone:NO]; 
      _isReading = NO; 
     } 
    } 
} 

-(void)goToURL:(NSURL *)url 
{ 
    //Handle URL... 
} 

- (IBAction)startButton:(id)sender { 

    if (!self.isReading) { 
     if ([self startReading]) { 
      [self.startButton setTitle:@"Stop" forState:UIControlStateNormal]; 
      [self.statusLabel setText:@"Scanning for QR Code..." ]; 
     } 
    } 
    else{ 
     [self stopReading]; 
     [self.startButton setTitle:@"Start!" forState:UIControlStateNormal]; 
    } 

    _isReading = !_isReading; 
} 

@end 
+0

Che non risponde alla domanda – JSA986

+0

Ma tu rispondi alla domanda? @ JSA986 –

+2

Quindi una risposta non pertinente alla domanda originale è preferibile a nessuna risposta? Non hai risposto alla domanda dell'OP, non c'era alcun riferimento a uno scanner QR o una richiesta di un'altra soluzione. La domanda è su 'Zbar'. Non ho bisogno di inviare una risposta per i miei commenti per essere meno pertinenti o corrette – JSA986

0

Questo funziona per me con iOS 8

ZBarReaderViewController *reader = [ZBarReaderViewController new]; 
reader.readerDelegate = self; 
reader.supportedOrientationsMask = ZBarOrientationMaskAll; 
[self presentViewController:reader animated:YES completion:nil]; 
[reader viewWillAppear:NO];`