Поэтому мне нужно написать QR-ридер для приложения iphone. Обычно такие фреймворки, как ZXING и ZBAr, позволяют загрузить приложение, а затем прочитать штрих-код. Я хочу интегрировать его в само приложение. Поэтому в основном я хочу иметь возможность нажать кнопку и прочитать QR-код. Это возможно? Если да, то есть ли надлежащая документация по этому поводу? Я пытался использовать ZXing, но когда я связываю двоичные файлы, libZXingWidget.a недоступен. Также документации недостаточно, чтобы знать, как интегрировать ее в приложение. Так дайте мне знать.
QR-ридер для iPhone
Ответы (4)
Вот код для настройки ZBar, обязательно добавьте SDK в свой проект и свяжите свою библиотеку.
-
(void)viewDidLoad
{
[ZBarReaderView class];
readerView.readerDelegate = self;
readerView.tracksSymbols = NO;
//CHOOSE CAMERA
if (some setting isEqual to CameraRear) {
readerView.device = [self backFacingCameraIfAvailable];
}
else {
readerView.device = [self frontFacingCameraIfAvailable];
}
[self relocateReaderPopover:[self interfaceOrientation]];
[readerView start];
}
-(AVCaptureDevice *)frontFacingCameraIfAvailable
{
NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
AVCaptureDevice *captureDevice = nil;
for (AVCaptureDevice *device in videoDevices)
{
if (device.position == AVCaptureDevicePositionFront)
{
captureDevice = device;
break;
}
}
// couldn't find one on the front, so just get the default video device.
if ( ! captureDevice)
{
captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
}
return captureDevice;
}
-(AVCaptureDevice *)backFacingCameraIfAvailable
{
NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
AVCaptureDevice *captureDevice = nil;
for (AVCaptureDevice *device in videoDevices)
{
if (device.position == AVCaptureDevicePositionBack)
{
captureDevice = device;
break;
}
}
// couldn't find one on the front, so just get the default video device.
if ( ! captureDevice)
{
captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
}
return captureDevice;
}
-(void)relocateReaderPopover:(UIInterfaceOrientation)toInterfaceOrientation{
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
readerView.previewTransform = CGAffineTransformMakeRotation(M_PI_2);
} else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
readerView.previewTransform = CGAffineTransformMakeRotation(-M_PI_2);
} else if (toInterfaceOrientation== UIInterfaceOrientationPortraitUpsideDown) {
readerView.previewTransform = CGAffineTransformMakeRotation(M_PI);
} else {
readerView.previewTransform = CGAffineTransformIdentity;
}
}
Это пошаговое руководство о том, как добавить встроенный считыватель QR-кода в ваше приложение для iphone. Посмотрите на этот пример проекта ZXing, если вам нужно знать, как его использовать.
Мне удалось интегрировать ZXING в мой тестовый проект. Я сделал это некоторое время назад, поэтому, возможно, я не помню всех проблем, с которыми я столкнулся и решил. В папку моей рабочей области я скопировал папку ZXing-2.0. Внутри у меня остались только папки: cpp, docs и iphone. В свою рабочую область (содержащую тестовый проект) я добавил проект ZXingWidget из папки ZXing-2.0. Это позволило мне добавить в компоновку настройку libZXingWidget.a. Когда я создаю свой тестовый проект, XCode обнаруживает зависимость и сначала создает виджет, а затем создает тестовый проект и связывает его с libZXingWidget.a.
Вот простой контроллер представления, который я реализовал для отображения внутри представления камеры, способного обнаруживать QR-код.
//
// MyVC.m
//
//
#import "MyVC.h"
#import "QRCodeReader.h"
@interface MyVC () {
ZXingWidgetController *_widController;
}
@end
@implementation MyVC
@synthesize labelResultString;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
_widController = [[ZXingWidgetController alloc] initWithDelegate:(id<ZXingDelegate>)self showCancel:YES OneDMode:NO];
QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init];
NSSet *readers = [[NSSet alloc ] initWithObjects:qrcodeReader,nil];
//[qrcodeReader release];
_widController.readers = readers;
//[readers release];
//NSBundle *mainBundle = [NSBundle mainBundle];
//_widController.soundToPlay = [NSURL fileURLWithPath:[mainBundle pathForResource:@"beep-beep" ofType:@"aiff"] isDirectory:NO];
_widController.overlayView.displayedMessage = @"";
_widController.wantsFullScreenLayout = NO;
//[self presentModalViewController:_widController animated:NO];
_widController.view.frame = CGRectMake(10, 10, 300, 300);//self.view.frame;
_widController.view.autoresizingMask = UIViewAutoresizingNone;
_widController.overlayView.frame = CGRectMake(0, 0, 300, 300);
_widController.overlayView.cropRect = CGRectMake(20, 20, 260, 260);
[self.view addSubview:_widController.view];
//[_widController release];
}
- (void)viewDidUnload {
[super viewDidUnload];
self.labelResultString = nil;
}
- (void)dealloc {
self.labelResultString = nil;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[_widController viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[_widController viewDidAppear:animated];
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[_widController viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[_widController viewDidDisappear:animated];
}
#pragma mark - ZXingDelegateMethods
- (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result {
self.labelResultString.text = result;
}
- (void)zxingControllerDidCancel:(ZXingWidgetController *)controller {
[self dismissModalViewControllerAnimated:YES];
}
@end
После того, как вы правильно настроили ZXing, код для получения QR-ридера буквально так прост:
Обязательно импортируйте этих двух парней для QR:
#import "ZXingWidgetController.h"
#import "QRCodeReader.h"
Затем в вашем контроллере вы настроите считыватель кода следующим образом:
ZXingWidgetController *widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO];
QRCodeReader *qrcodeReader = [[QRCodeReader alloc] init];
NSSet *readers = [[NSSet alloc] initWithObjects:qrcodeReader,nil];
widController.readers = readers;
[self presentModalViewController:widController animated:YES];
Вы в основном настраиваете контроллер, который обрабатывает чтение кода (ZXingWidgetController
), а затем предоставляете ему набор всех типов считывателей кода, которые вы хотите (здесь я только что использовал QRCodeReader
). Наконец, вы просто представляете его как контроллер модального представления.
Затем вам нужно будет реализовать <ZXingDelegate>
и следующие функции delegate
:
- (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result
{
[self dismissModalViewControllerAnimated:YES];
NSLog(@"%@",result); //Simple NSString result.
}
- (void)zxingControllerDidCancel:(ZXingWidgetController*)controller
{
[self dismissModalViewControllerAnimated:YES];
NSLog(@"Cancelled");
}
Самое сложное это просто настроить. Я нашел это руководство наиболее полезным (извините, что я использую ссылку): Как установить ZXing в Xcode 4 Комментарии также помогут, если у вас возникнут проблемы.