2

ZBarSDK 1.2 をhttp://zbar.sourceforge.net/download.htmlからダウンロードします。ZBarReaderViewController の sourceType を UIImagePickerControllerSourceTypeCamera に設定するとうまくいきます。しかし、sourceType を UIImagePickerControllerSourceTypePhotoLibrary または UIImagePickerControllerSourceTypeSavedPhotosAlbum に設定すると、アプリがクラッシュし、次のようなエラーが発生しました。

2012-05-28 17:23:03.476 Wow[4137:10703] * -[ZBarReaderViewController setSourceType:]、/Users/spadix/zbar/hg/sdk/iphone/ZBarReaderViewController.m:650 でのアサーションの失敗 2012-05-28 17:23:03.626 Wow[4137:10703] *キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了します。理由: 'sourceType プロパティにサポートされていない値 (1) を設定しようとしています'

この問題をグーグルで検索しましたが、解決策が見つかりません。誰かこの問題を解決する方法を教えてもらえますか?Dose バージョン 1.2 は UIImagePickerControllerSourceTypeCamera のみをサポートしていますか?Dose the source witch I download is bad?

ありがとう。

4

1 に答える 1

2

保存された画像を選択する場合は、基本的に iOS 標準のメディア ビュー コントローラーを提示します。ユーザーが標準の iOS メディア コントローラーから画像を選択した後、ZBarImageScanner のコピーをインスタンス化して画像をスキャンします。これが理にかなっている場合は、ステップ 5 にスキップして、ZBarImageScanner を使用して UIImage をスキャンする方法を確認してください。それ以外の場合は、以下の手順に従ってください。お役に立てれば。

  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.
        }
    }
    
于 2013-05-24T03:01:49.510 に答える