0

アプリケーションでカスタム カメラ オーバーレイを作成する必要がありますが、実際に写真を撮ったり、カメラを前面から背面に切り替えたり、キャンセルしたりするのに苦労しています。

CameraOverlayViewController クラスを作成し、ストーリーボードにすべてのビューを設定しました。

ユーザーが写真を撮ることを選択したとき、オーバーレイを取得するために私が行っていることは次のとおりです。

CameraOverlayViewController *customerOverlay = [self.storyboard instantiateViewControllerWithIdentifier:@"camera_overlay"];

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.showsCameraControls = NO;
picker.cameraOverlayView = customerOverlay.view;

customerOverlay.pickerRefernce = picker;

[self presentViewController:picker animated:YES completion:nil];

これは、カメラのオーバーレイを表示したいときにうまく機能します。

CameraOverlayViewController のコードは次のとおりです。

#import <UIKit/UIKit.h>

@interface CameraOverlayViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate>

@property (strong, nonatomic) UIImagePickerController *pickerRefernce;
@property (weak, nonatomic) IBOutlet UIButton *cameraButton;
@property (weak, nonatomic) IBOutlet UIView *navBar;

- (IBAction)takePicture:(id)sender;
- (IBAction)switchCamera:(id)sender;
- (IBAction)cancelPicture:(id)sender;

@end


//iphone screen dimensions
#define SCREEN_WIDTH  self.view.bounds.size.width
#define SCREEN_HEIGTH self.view.bounds.size.height

@interface CameraOverlayViewController ()

@end

@implementation CameraOverlayViewController

@synthesize pickerRefernce = _pickerRefernce;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.view.backgroundColor = [UIColor clearColor];
    self.navBar.backgroundColor = [UIColor PFYellow];

    self.cameraButton.frame = CGRectMake((SCREEN_WIDTH / 2) - (self.cameraButton.frame.size.width / 2), SCREEN_HEIGTH - self.cameraButton.frame.size.height - 20, self.cameraButton.frame.size.width, self.cameraButton.frame.size.height);


}

- (IBAction)takePicture:(id)sender {

    [self.pickerRefernce takePicture];

}


- (IBAction)switchCamera:(id)sender {

    if(self.pickerRefernce.cameraDevice == UIImagePickerControllerCameraDeviceFront) {

        self.pickerRefernce.cameraDevice = UIImagePickerControllerCameraDeviceRear;

    } else {

        self.pickerRefernce.cameraDevice = UIImagePickerControllerCameraDeviceFront;

    }

}


- (IBAction)cancelPicture:(id)sender {



}

基本的に、オーバーレイ ビューの任意のボタン (エラーを引き起こすコードがないキャンセル ボタンを含む) を押すと、Xcode で重大なエラーが発生します。

唯一の出力は "(lldb)" であり、"Thread 1: EXC_BAD_ACCESS(code = 1, address=0x69786d54)" という例外が main.m でスローされます。

アプリケーションは実行を続けます (カメラ ビューにはまだライブ画像が表示されます) が、何かをタップしても反応がありません。

また、実際にクラッシュさせようとして、プログラム実行の続行ボタンを少なくとも 200 回クリックしましたが、何も起こりません。

私がオンラインで見つけたすべての例は古くなっています (りんごの例「PhotoPicker」でさえ、xib ファイルと私が慣れていない奇妙なアウトレットを使用しています)。すべての適切なメソッドを確実に呼び出す方法。

どんなガイダンスも素晴らしいでしょう、ありがとう!

4

0 に答える 0