写真 - UIImagePickerControllerのcameraViewTransformは、iOS 10ベータ版で 'スケーリング'と 'トランスレーション'を無視しています




swift 写真 アプリ (4)

hereで答えhere 、この問題はiOS 10.2で修正されており、カメラを再度表示する前にcameraViewTransformプロパティを使用できます。

UIImagePickerControllerのライブプレビューを画面全体に拡大するために、以下のコードを使用しています。 これは今まで完全に機能しました。 数日前に、私はiPhone 5にiOS 10 beta 7をインストールしました、そして、それはもう拡大しません。 UIImagePickerControllerのビューの下部に黒いパッチが見えます。 cameraViewTransformCGAffineTransformMakeScaleおよびCGAffineTransformMakeTranslation呼び出しを無視しているようcameraViewTransform

これが私のカメラコントローラの起動方法です。 独自のカスタムオーバーレイビューを提供するために、 "permitEditing"と "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 beta 8で動作するiPhone 5sからのスクリーンショット

iOS 8.2で実行されているiPhone 5sからのスクリーンショット

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

他の誰かがこの問題に直面しましたか? これはiOS 10ベータOSに現れる本当に変な動作です。 これに対する回避策を見つけることができません。 お知らせ下さい。

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


カメラの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);
          });  
  }

不思議なことにそれはプレゼンテーションが完了した後に私たちがそれを変換することを可能にするだけです。

例:

self.presentViewController(
        self.imagePicker,
        animated: true,
        completion: {
            let screenSize = UIScreen.mainScreen().bounds.size
            let ratio: CGFloat = 4.0 / 3.0
            let cameraHeight: CGFloat = screenSize.width * ratio
            let scale: CGFloat = screenSize.height / cameraHeight

            self.imagePicker.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenSize.height - cameraHeight) / 2.0)
            self.imagePicker.cameraViewTransform = CGAffineTransformScale(self.imagePicker.cameraViewTransform, scale, scale)
        }
    )

このコードは、画面サイズに合わせてカメラビューを変換します。

これが回避策だと注意します。 それは動作しますが、ユーザーはそれがプレゼンテーションのサイズを変更するのを見るでしょう。


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

以下のコードは私のために働きました。 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を使用することAVLayerVideoGravityResizeAspectFill 。 この構成では、カメラビューは元の縦横比を維持しながらコンテナビューを埋めます。

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

#import <AVFoundation/AVFoundation.h>




xcode8-beta6