我在http://zbar.sourceforge.net/download.html下载ZBarSDK 1.2 当我将 ZBarReaderViewController 的 sourceType 设置为 UIImagePickerControllerSourceTypeCamera 时效果很好。 但是当我将 sourceType 设置为 UIImagePickerControllerSourceTypePhotoLibrary 或 UIImagePickerControllerSourceTypeSavedPhotosAlbum 时,应用程序崩溃并收到如下错误:
2012-05-28 17:23:03.476 Wow[4137:10703] * Assertion failure in -[ZBarReaderViewController setSourceType:], /Users/spadix/zbar/hg/sdk/iphone/ZBarReaderViewController.m:650 2012-05-28 17:23:03.626 Wow[4137:10703] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to set unsupported value (1) for sourceType property'
我google了这个问题,但找不到解决方案。有人可以告诉我如何解决这个问题吗?1.2版本只支持UIImagePickerControllerSourceTypeCamera吗?我下载的源代码是否有问题?
谢谢。
最佳答案
如果你想选择保存的图像,基本上呈现标准的 iOS 媒体 View Controller 。用户从标准 iOS 媒体 Controller 选择图像后,您可以实例化 ZBarImageScanner 的副本来扫描图像。如果这是有意义的,请跳到步骤 5 以了解如何使用 ZBarImageScanner 扫描 UIImage。否则,请尝试按照以下步骤操作。希望这会有所帮助。
首先向用户显示带有选项的警报。
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Camera", @"Camera Roll", @"Photo Library", nil]; [sheet showInView:self.view];
选择时,
- (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]; } }
当且仅当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]; } }
我们可以通过几种方法来检测使用了哪个媒体选择器
- (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]; } }
还有多汁的部分
- (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. } }
关于photolibrary - 我无法在 ZBarSDK 中使用 sourceType 作为 UIImagePickerControllerSourceTypePhotoLibrary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10782660/