2014-09-22 12 views
9

Ich habe meine App mit ZBar integriert. Es funktioniert tadellos in iOS 7.1 und darunter, aber in iOS 8.0-Geräten finde ich, dass die Kameraansicht zuerst in Schwarz gezeigt wird. Wenn ich die App jedoch in den Hintergrundzustand bringe und sie erneut an den Vordergrund sende, wenn die Kameraansicht geöffnet ist, funktioniert sie. Hat jemand das erlebt?ZBar SDK und Kamera funktioniert nicht richtig in iOS 8

Dank

+0

Einer meiner Benutzer ist das gleiche Problem auf Iphone 6 erfahren. Haben Sie den ZBar-Entwicklern einen Fehlerbericht eingereicht? – nanako

+0

ZBar verwendet 32-Bit-Code und niemand hat sie bis 64 Bit noch portiert. Hier ist der Quellcode - das letzte Commit war vor 2 Jahren - https://github.com/ZBar/ZBar. Es funktioniert gut auf IOS 6. Ich habe dieses Problem selbst und ich bin auf der Suche nach einem Ersatz-SDK - das nächste kostenlose 3rd-Party-SDK ist ZXING, aber sie haben auch Probleme mit 64 Bit), bis die 3rd Party SDKs portiert werden Option ist die mit IOS eingebettet (siehe unten) es gibt Ihnen die Möglichkeit, QR-Codes und als Bonus PDF417 und Aztec Codes jedoch - Unterstützung für 1D Barcode (UPC, CODE128, etc.) Scannen ist nicht da – Paulo

+0

Ich habe es gerade versucht diese Version von Zing in IOS 8 - es scheint zu arbeiten - https://github.com/TheLevelUp/ZXingObjC – Paulo

Antwort

0

Wenn Sie nur QR-Code Scannen benötigen, ist es viel einfacher ist, dies mit nativer Mitteln zu tun:

Im .h Ihrer VC hinzufügen:

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

Und 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

Das beantwortet die Frage nicht – JSA986

+0

Aber Sie beantworten die Frage? @ JSA986 –

+2

Also eine Antwort ohne Relevanz für die ursprüngliche Frage ist besser als keine Antwort? Sie haben die Frage des OP nicht beantwortet. Es gab keinen Verweis auf einen QR-Scanner oder eine Anfrage für eine andere Lösung. Die Frage ist über 'Zbar'. Ich brauche keine Antwort zu geben, damit meine Kommentare weniger relevant oder richtig sind – JSA986

0

Dies funktioniert für mich mit iOS 8

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