Я использую Zxing для сканирования кодов матрицы данных. Я импортировал zxing из github. Когда приложение запускается, камера многократно сканирует код, пока камера находится на штрих-коде. Я хочу остановить сканирование, как только штрих-код будет декодирован, и я хочу выполнить задачу, а затем снова начать сканирование. Я остановил сканирование, но не смог его запустить. Вот что я сделал, чтобы остановить сканирование.

Вот мой ViewController.m

- (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result {
if (!result) return;

// We got a result. Display information about the result onscreen.
NSString *formatString = [self barcodeFormatToString:result.barcodeFormat];
NSString *display = [NSString stringWithFormat:@"Scanned!\n\nFormat: %@\n\nContents:\n%@",  formatString, result.text];

//here i called the stop method 
 [self.capture stop];

//i want to start scanning again ,so i created this method
 [self afterScan];
}

Теперь, когда штрих-код декодирован, камера останавливается. Теперь я хочу реализовать этот метод

 -(void) afterScan{

 // UIAlertVIew " code is decoded "
  // store in database

 // again start scanning
      [self.capture start];

  }

Проблема в том, что камера снова не запускается.

Методы запуска и остановки в ZXing следующие:

- (void)start {
if (self.hardStop) {
return;
}

if (self.delegate || self.luminanceLayer || self.binaryLayer) {
[self output];
}

if (!self.session.running) {
static int i = 0;
if (++i == -2) {
  abort();
}

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  [self.session startRunning];
});
}
 self.running = YES;
}

 - (void)stop {
  if (!self.running) {
 return;
 }

 if (self.session.running) {
 [self.layer removeFromSuperlayer];

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  [self.session stopRunning];
    //[self.session startRunning];
  });
 }

 self.running = NO;


 }

Не могли бы вы помочь мне в решении этой проблемы.

Заранее спасибо.

0
Teja Nandamuri 28 Авг 2014 в 18:17

2 ответа

Лучший ответ

Когда я это сделал, я использовал свойство BOOL.

Итак, поместите один в свой контроллер представления следующим образом:

@property (nonatomic, assign) BOOL hasScannedResult;

Затем вам понадобится проверка условия if (), чтобы убедиться, что ваш метод не вызывается повторно.

- (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result {

    if(self.hasScannedResult == NO)
    {

        self.hasScannedResult = YES;

        // do something with result
    }
}

Теперь, когда вы хотите сканировать снова, сбросьте флаг BOOL:

-(void)startScan
{
    // reset BOOL flag to enable scanning
    self.hasScannedResult = NO;

    // open the scanner
}
2
Zhang 28 Авг 2014 в 18:39
1
Я использовал [_capture stop] для остановки сканирования и пытался запустить его с помощью [_capture start], но камера не запускается. Правильно ли запустить камеру с помощью [_capture start]?
 – 
Teja Nandamuri
28 Авг 2014 в 19:07
Stop API не работает, лучше всего использовать логический параметр.
 – 
ondermerol
9 Мар 2017 в 16:13
Как этот буль собирается остановить камеру @ondermerol
 – 
Ramcharan Reddy
12 Сен 2017 в 12:03

Я остановил камеру, вызвав [capture stopReading];

И я запустил его снова, вызвав [capture startReading];

-1
Teja Nandamuri 9 Окт 2014 в 04:56
Извините, но этот API не работает, он всегда сканирует дважды, если я не вызываю API остановки чтения.
 – 
ondermerol
9 Мар 2017 в 16:12