3

現在、QR コードの読み取りに ZBarSDK を使用する iPad アプリケーションを開発しています。

私はZBarReaderView (NOT ) を使用しているので、を使用して描画されUIViewControllerた正面カメラを表示しています (以下のコードを参照)。UIViewCGRect

私の問題は、カメラがビュー内の側面に来ることです。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;
}
4

3 に答える 3

6

私は同じ問題を抱えていて、それを簡単に解決しました!

私はちょうど呼び出す必要がありました:

[reader willRotateToInterfaceOrientation: toInterfaceOrientation duration: duration];

ZbarReaderView を含むビュー コントローラの willRotate... 内。

于 2013-04-03T17:46:25.827 に答える
3

さて、オリエンテーションが機能するようになりました。なぜ機能するのかわかりませんが、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 を回転させた場合の回転を修正する必要があります。

于 2012-12-30T08:03:30.583 に答える
1

これは私にとってはうまくいきました:

// 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);
}
于 2013-03-01T07:55:48.060 に答える