ZBarReaderView UIView Проблема с ориентацией камеры

В настоящее время я разрабатываю приложение для iPad, которое использует ZBarSDK для чтения QR-кодов.

Я использую ZBarReaderView (НЕ UIViewController), поэтому я показываю фронтальную камеру в UIView, нарисованном с помощью CGRect (см. код ниже).

Моя проблема в том, что камера появляется сбоку в поле зрения. Приложение для iPad будет разработано ТОЛЬКО для работы в ландшафтном режиме.

Когда появляется UIView, изображение находится сбоку, и я не знаю, как это исправить. Я попытался использовать CGAffineTransform, который успешно несколько меняет угол, но как это будет работать, если iPad перевернут в другую сторону?

Я видел несколько других сообщений об этой похожей проблеме, но ни одно решение не сработало для меня. Стоит отметить, что я использую IOS6 и, пожалуйста, помните, что я использую ZBarReaderView, поэтому supportedOrientationsMask НЕдоступна.

Я хочу, чтобы пользователь видел изображение с камеры в вертикальном положении независимо от того, является ли пейзаж левым или правым. Однако прямо сейчас, независимо от того, в какую сторону оно повернуто, видео отображается боком (поэтому я могу видеть себя под углом 90 градусов в сторону). UIView тоже не меняется при повороте экрана. Я немного потерян.

Код:

- (void) viewDidAppear: (BOOL) animated {

    ZBarReaderView * readerView = [ZBarReaderView new];
    ZBarImageScanner * scanner = [ZBarImageScanner new];
    [scanner setSymbology: ZBAR_I25
                   config: ZBAR_CFG_ENABLE
                       to: 0];

    [readerView initWithImageScanner:scanner];
    readerView.readerDelegate = self;
    readerView.tracksSymbols = YES;

    readerView.frame = CGRectMake(20,220,230,230);
    readerView.torchMode = 0;
    readerView.device = [self frontFacingCameraIfAvailable];
    [readerView start];

    [self.view addSubview: readerView];

}

-(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;
    }
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
        return YES;
    } else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
        return YES;
    } else {
        return NO;
    }
}

- (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) orient
                                 duration: (NSTimeInterval) duration
{
    if (orient == UIInterfaceOrientationLandscapeLeft) {
        [readerView willRotateToInterfaceOrientation: orient
                                            duration: duration];

    }
    if (orient == UIInterfaceOrientationLandscapeRight) {
        [readerView willRotateToInterfaceOrientation: orient
                                            duration: duration];

    }
}

- (BOOL)shouldAutorotate {

    UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];

    if (orientation == UIInterfaceOrientationLandscapeLeft) {
        return YES;
    } else if (orientation == UIInterfaceOrientationLandscapeRight) {
        return YES;
    } else {
        return NO;
    }
}

-(NSUInteger) supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

person Bobster4300    schedule 30.12.2012    source источник


Ответы (3)


У меня возникла такая же проблема, и я решил ее просто!

Мне просто нужно было позвонить:

[reader willRotateToInterfaceOrientation: toInterfaceOrientation duration: duration];

внутри willRotate... контроллера представления, содержащего ZbarReaderView.

person user2241649    schedule 03.04.2013
comment
Это правильный способ обработки изменения ориентации ZBar. - person Deminetix; 10.02.2014

Хорошо, теперь у меня работает ориентация. Не знаю, почему это работает сейчас, но вот конечный код для части readerView:

readerView = [ZBarReaderView new];
ZBarImageScanner * scanner = [ZBarImageScanner new];
[scanner setSymbology: ZBAR_I25
               config: ZBAR_CFG_ENABLE
                   to: 0];
[readerView initWithImageScanner:scanner];
readerView.readerDelegate = self;

readerView.tracksSymbols = YES;

readerView.frame = CGRectMake(20,220,230,230);
readerView.torchMode = 0;
readerView.device = [self frontFacingCameraIfAvailable];

[self relocateReaderPopover:[self interfaceOrientation]];

[readerView start];

[self.view addSubview: readerView];

Обратите внимание, что единственная реальная разница в этой строке:

ZBarReaderView * readerView = [ZBarReaderView new];

Изменение этой строки устранило проблему с начальной ориентацией. Не знаю, почему, но это произошло. Теперь мне просто нужно исправить поворот, если пользователь поворачивает iPad.

person Bobster4300    schedule 30.12.2012
comment
Большое спасибо за этот ответ, но могу ли я узнать, что такое readerView.device? как реализовать переворот камеры, который позволяет пользователю выбирать, использовать переднюю или заднюю камеру? - person Js Lim; 15.03.2013

Это отлично сработало для меня:

// ADD: present a barcode reader that scans from the camera feed
ZBarReaderViewController *reader = [ZBarReaderViewController new];
reader.readerDelegate = self;
//reader.supportedOrientationsMask = ZBarOrientationMaskAll;
ScanOverlay *overlayController = [[ScanOverlay alloc] initWithNibName:@"ScanOverlay" bundle:nil];
reader.cameraOverlayView = overlayController.view;
ZBarImageScanner *scanner = reader.scanner;
// TODO: (optional) additional reader configuration here
reader.supportedOrientationsMask = ZBarOrientationMask(UIInterfaceOrientationLandscapeRight||UIInterfaceOrientationLandscapeLeft);
reader.wantsFullScreenLayout = YES;
reader.showsZBarControls = NO;  //If we don't set this to NO, the overlay may not display at all
reader.tracksSymbols = YES;

//Для поддержки альбомной ориентации

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (UIDeviceOrientationLandscapeLeft == orientation) {
    //Rotate 90
    reader.cameraViewTransform = CGAffineTransformMakeRotation (3*M_PI/2.0);
} else if (UIDeviceOrientationLandscapeRight == orientation) {
    //Rotate 270
    reader.cameraViewTransform = CGAffineTransformMakeRotation (M_PI/2.0);
}
person Joe M    schedule 01.03.2013