QR-ридер для iPhone

Поэтому мне нужно написать QR-ридер для приложения iphone. Обычно такие фреймворки, как ZXING и ZBAr, позволяют загрузить приложение, а затем прочитать штрих-код. Я хочу интегрировать его в само приложение. Поэтому в основном я хочу иметь возможность нажать кнопку и прочитать QR-код. Это возможно? Если да, то есть ли надлежащая документация по этому поводу? Я пытался использовать ZXing, но когда я связываю двоичные файлы, libZXingWidget.a недоступен. Также документации недостаточно, чтобы знать, как интегрировать ее в приложение. Так дайте мне знать.


person CodeGeek123    schedule 24.07.2012    source источник
comment
Вы спрашиваете, как добавить фреймворк в проект?   -  person Dustin    schedule 24.07.2012
comment
ZXing поставляется с библиотекой без графического интерфейса, когда я последний раз проверял.   -  person Seva Alekseyev    schedule 24.07.2012
comment
Нет. Я хочу знать, есть ли какие-либо фреймворки, которые я могу добавить и использовать помимо ZXing, потому что я не могу найти libZXingWidget.a, а также нет документации о том, как я буду его использовать.   -  person CodeGeek123    schedule 24.07.2012
comment
Как только вы правильно настроите ZXing, им будет очень легко пользоваться. Я очень рекомендую это. Это также очень быстро и точно. Я боролся с ним пару часов, но нашел несколько хороших руководств по его настройке. Убедитесь, что вы добавляете правильные пути поиска заголовков и пути поиска пользовательских заголовков.   -  person Justin Paulson    schedule 24.07.2012
comment
Вы всегда можете задать вопрос здесь или в списке рассылки ZXing, если у вас возникнут проблемы. Участники zxing (включая меня) внимательно следят за обоими. FBOFW, примеры проектов — лучший источник информации о том, как это сделать.   -  person smparkes    schedule 24.07.2012


Ответы (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;
    }
}
person Eric    schedule 24.07.2012

Это пошаговое руководство о том, как добавить встроенный считыватель QR-кода в ваше приложение для iphone. Посмотрите на этот пример проекта ZXing, если вам нужно знать, как его использовать.

person Dustin    schedule 24.07.2012
comment
Этот тоже хорош: yannickloriot.com/2011 /04/как установить-zxing-в-xcode-4 - person Justin Paulson; 24.07.2012

Мне удалось интегрировать 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
person Mateusz    schedule 24.07.2012

После того, как вы правильно настроили 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 Комментарии также помогут, если у вас возникнут проблемы.

person Justin Paulson    schedule 24.07.2012