11

以下のコードを使用して、UIImagePickerController のライブ プレビューをスケーリングして画面全体に表示しています。これは今まで完璧に機能しました。数日前に、iPhone 5 に iOS 10 ベータ 7 をインストールしましたが、拡張できなくなりました。UIImagePickerController のビューの下部に黒いパッチが表示されます。and呼び出しcameraViewTransformを無視しているようです。CGAffineTransformMakeScaleCGAffineTransformMakeTranslation

これがカメラコントローラーを起動する方法です。独自のカスタム オーバーレイ ビューを提供するために、「allowsEditing」と「showsCameraControls」の両方を「NO」に設定しました。

objImagePickerController =[[UIImagePickerController alloc] init];

objImagePickerController.delegate = self;
objImagePickerController.sourceType =UIImagePickerControllerSourceTypeCamera;
objImagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
objImagePickerController.allowsEditing = NO;
objImagePickerController.showsCameraControls= NO;

これは、カメラのライブ プレビューをスケーリングするために使用するものです。

CGSize screenSize = [[UIScreen mainScreen] bounds].size;
float screenHeight= MAX(screenSize.height, screenSize.width);
float screenWidth= MIN(screenSize.height, screenSize.width);

float cameraAspectRatio = 4.0 / 3.0;
float imageWidth = floorf(screenWidth * cameraAspectRatio);
float scale = ceilf((screenHeight / imageWidth) * 10.0) / 10.0;

objImagePickerController.cameraViewTransform= CGAffineTransformMakeScale(scale, scale);

これは、私自身の要件に合わせて、従来のモーダル表示方法ではなく、サブビューとしてカメラ ビューを追加する方法です。

 [[[UIApplication sharedApplication] keyWindow]addSubview:objImagePickerController.view];

iOS 10 ベータ 8 で実行されている iPhone 5s のスクリーンショット

ここに画像の説明を入力

iOS 8.2 で動作する iPhone 5s のスクリーンショット

ここに画像の説明を入力

上記のスクリーンショットからわかるように、は iOS 10 ベータ版をcameraViewTransform尊重しません。CGAffineTransformMakeScale

他の誰かがこの問題に直面しましたか? これは、iOS 10 ベータ OS に見られる非常に奇妙な動作です。これに対する回避策が見つかりません。お知らせ下さい。

注:: objImagePickerController は UIImagePickerController のインスタンスです。

4

5 に答える 5

2

camera e AVCaptureSessionDidStartRunningNotification が発生した後、set cameraViewTransform を遅らせることで解決しました。

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cameraIsReadyNotification:) name:AVCaptureSessionDidStartRunningNotification object:nil]; 

-

- (void)cameraIsReadyNotification:(NSNotification *)notification  
 {  
          dispatch_async(dispatch_get_main_queue(), ^{  
          float scale = ceilf((screenHeight / imageWidth) * 10.0) / 10.0;

          objImagePickerController.cameraViewTransform=CGAffineTransformMakeScale(scale, scale);
          });  
  }
于 2016-09-23T09:44:43.640 に答える
1

拡張現実アプリケーションで同じ問題が発生し、最終的にUIImagePickerControllerの代わりにAVFoundationフレームワーク を使用して解決しました。iOS 10では動かなくなったようです。cameraViewTransform

以下のコードは私のために働いた。関数を UIViewController サブクラスに追加して呼び出します。

- (BOOL) initCamera {

    AVCaptureSession *captureSesion = [[AVCaptureSession alloc] init];
    if ([captureSesion canSetSessionPreset:AVCaptureSessionPresetHigh]) {
        [captureSesion setSessionPreset:AVCaptureSessionPresetHigh];
    } else {
        return false;
    }
    AVCaptureDevice *camera = nil;
    NSArray<AVCaptureDevice*>* devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    // Select back camera
    for (AVCaptureDevice *device in devices) {
        if ([device position]==AVCaptureDevicePositionBack) {
            camera = device;
            break;
        }
    }
    if (camera == nil) {
        // Back camera not found.
        return false;
    }

    AVCaptureStillImageOutput *imageOutput = [[AVCaptureStillImageOutput alloc]init];
    [imageOutput setOutputSettings: @{AVVideoCodecKey: AVVideoCodecJPEG}];
    AVCaptureDeviceInput *deviceInput = [[AVCaptureDeviceInput alloc]initWithDevice:camera error: nil];

    if (![captureSesion canAddInput:deviceInput] || ![captureSesion canAddOutput:imageOutput]) {
        return false;
    }
    [captureSesion addInput:deviceInput];
    [captureSesion addOutput:imageOutput];

    AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:captureSesion];

    // "Aspect Fill" is suitable for fullscreen camera.
    layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    layer.frame = self.view.bounds;
    layer.connection.videoOrientation = AVCaptureVideoOrientationPortrait;

    [self.view.layer addSublayer:layer];
    [captureSesion startRunning];

    return true;
}

最も重要なことは、使用することAVLayerVideoGravityResizeAspectFillです。この構成では、元の縦横比を維持したまま、カメラ ビューがコンテナー ビューを満たします。

フレームワークをインポートすることを忘れないでください:)

#import <AVFoundation/AVFoundation.h>
于 2016-09-16T14:38:00.933 に答える