2012-05-28 2 views
2

загрузить ZBarSDK 1,2 в http://zbar.sourceforge.net/download.html Это хорошо работает, когда я поставил SourceType из ZBarReaderViewController в UIImagePickerControllerSourceTypeCamera. Но когда я поставил SourceType в UIImagePickerControllerSourceTypePhotoLibrary или UIImagePickerControllerSourceTypeSavedPhotosAlbum, приложение разбился, и я получил ошибку следующим образом:я не могу использовать SourceType, как UIImagePickerControllerSourceTypePhotoLibrary в ZBarSDK

2012-05-28 17: 23: 03,476 Wow [4137: 10703] * отказ в Assertion - [ZBarReaderViewController setSourceType:], /Users/spadix/zbar/hg/sdk/iphone/ZBarReaderViewController.m:650 2012-05-28 17: 23: 03,626 Wow [4137: 10703] * Нагрузочного приложение из-за uncaught exception 'NSInternalInconsistencyException', причина: 'попытка установить неподдерживаемое значение (1) для свойства sourceType'

У меня есть проблема с этой проблемой, но не могу найти решение. Может кто-нибудь сказать мне, как растворить эту проблему? Доза версии 1.2 поддерживает только UIImagePickerControllerSourceTypeCamera? Доза исходной ведьмы Я загружаю плохо?

Спасибо.

+0

Вы нашли ответ, я пока в поисках решение. Просьба указать, есть ли у вас какой-либо способ. –

ответ

2

В основном представлен стандартный медиа-контроллер iOS, если вы хотите выбрать сохраненное изображение. После того, как пользователь выбрал изображение со стандартного медиаредактора iOS, вы создаете экземпляр ZBarImageScanner для сканирования изображения. Если это имеет смысл, перейдите к шагу 5, чтобы увидеть, как я просматриваю UIImage с помощью ZBarImageScanner. В противном случае попробуйте выполнить следующие шаги. Надеюсь это поможет.

  1. Сначала покажите пользователю предупреждение с опциями.

    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"" delegate:self 
                  cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Camera", @"Camera Roll", @"Photo Library", nil]; 
    [sheet showInView:self.view]; 
    
  2. При выборе,

    - (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex { 
        UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
        switch (buttonIndex) { 
         case 0: sourceType = UIImagePickerControllerSourceTypeCamera; break; 
         case 1: sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; break; 
         case 2: sourceType = UIImagePickerControllerSourceTypePhotoLibrary; break; 
         default: break; 
        } 
        if (buttonIndex <= 2) { 
         [self presentBarcodeReader:sourceType]; 
        } 
    } 
    
  3. тогда и только тогда, когда SourceType == UIImagePickerControllerSourceTypeCamera вы используете Zbar представить интерфейс захвата изображения.

    - (void)presentBarcodeReader:(UIImagePickerControllerSourceType)sourceType { 
        if (sourceType == UIImagePickerControllerSourceTypeCamera) { 
         ZBarReaderViewController *reader = [ZBarReaderViewController new]; 
         reader.readerDelegate = self; 
         reader.showsZBarControls = YES; 
         reader.supportedOrientationsMask = ZBarOrientationMaskAll; 
    
         ZBarImageScanner *scanner = reader.scanner; 
         [scanner setSymbology: ZBAR_I25 
             config: ZBAR_CFG_ENABLE 
              to: 0]; 
         [self presentModalViewController:reader animated:YES]; 
        } else { 
         UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init]; 
         mediaUI.sourceType = sourceType; 
         mediaUI.mediaTypes = [UIImagePickerController   availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum]; 
         mediaUI.allowsEditing = NO; 
         mediaUI.delegate = self; 
         [self presentModalViewController:mediaUI animated:YES]; 
        } 
    } 
    
  4. пару способов, мы можем определить, какие сборщика СМИ использовали

    - (void)imagePickerController:(UIImagePickerController*)reader didFinishPickingMediaWithInfo:(NSDictionary*)info { 
        id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults]; 
        if (results) { 
         ZBarSymbol *symbol = nil; 
         for (symbol in results) break; 
    
         [reader dismissViewControllerAnimated:YES completion:^{ 
          [self partLookup:symbol.data]; 
         }]; 
        } else { 
         UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage] ?   [info objectForKey:UIImagePickerControllerEditedImage] : [info   objectForKey:UIImagePickerControllerOriginalImage]; 
         [self scanImage:image]; 
        } 
    } 
    
  5. и сочную часть

    - (void)scanImage:(UIImage*)image { 
        ZBarImage *zImage = [[ZBarImage alloc] initWithCGImage:image.CGImage]; 
        ZBarImageScanner *scanner = [[ZBarImageScanner alloc] init]; 
        [scanner setSymbology: ZBAR_I25 
            config: ZBAR_CFG_ENABLE 
             to: 0]; 
        [scanner scanImage:zImage]; 
        ZBarSymbolSet *set = [scanner results]; 
    
        for (ZBarSymbol *symbol in set) { 
         NSLog(@"%@", symbol.data); 
         // process symbol.data however you please. 
        } 
    } 
    
+0

Здравствуйте @Brad, я использовал ваш код и получил одно предупреждение. ReaderSampleViewController.m: 115: 26: предупреждение: присвоение 'id ' из несовместимого типа 'ReaderSampleViewController * const __strong' mediaUI.delegate = self; –

+0

@PratikMistry звучит так, будто вам просто нужно объявить, что ваш класс соответствует протоколу UIImagePickerControllerDelegate. –

+0

Я уже делал это, все еще сталкиваясь с тем же вопросом. –