1

この質問は、ここで尋ねられた既存の質問と非常によく似ていますUIImagePickerControllerCameraDeviceFront は、提示されたソリューションを試すたびにのみ機能しますが、私にとっては機能しませんでした

2 つのビュー コントローラーを使用した最も単純なプロジェクトがあります。青いものでは、UIImagePickerController を含む小さな UIView を表示しています。注: アプリの起動時に前面カメラを表示しています。

次のボタンを押してオレンジ色のビュー コントローラーに移動し、戻るボタンを押して青色のビュー コントローラーに戻ると、UIImagePickerController が前面から背面に反転します。その理由は、忙しいと思い、リアカムに移動するためだと思います。ビューコントローラーの間を行き来し続けると、カメラは前後、前後、前後、前後に反転し続けます...

これが私のコードとスクリーンショットです。何が間違っていますか?

私の *.h で

#import <UIKit/UIKit.h>

@interface v1ViewController : UIViewController <UIImagePickerControllerDelegate>
{
    UIImagePickerController *picpicker;
    UIView *controllerView;

}

@property (nonatomic, retain) UIImagePickerController *picpicker;
@property (nonatomic, retain) UIView *controllerView;

@end

*.m ファイル (このコードは、青色のビュー コントローラーが表示されている場合にのみ使用されます)

#import "v1ViewController.h"
#import <MobileCoreServices/UTCoreTypes.h>

@implementation v1ViewController

@synthesize picpicker;
@synthesize controllerView;

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];


    picpicker = [[UIImagePickerController alloc] init];

    picpicker.delegate = self;
    picpicker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeImage, nil];
    picpicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    picpicker.cameraDevice = UIImagePickerControllerCameraDeviceFront;
    picpicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
    picpicker.showsCameraControls = NO;
    picpicker.navigationBarHidden = NO;
    picpicker.wantsFullScreenLayout = NO;

    controllerView = picpicker.view;
    [controllerView setFrame:CGRectMake(35, 31, 250, 250)];

    controllerView.alpha = 0.0;
    controllerView.transform = CGAffineTransformMakeScale(1.0, 1.0);

    [self.view addSubview:controllerView];

    [UIView animateWithDuration:0.3
                          delay:0.0
                        options:UIViewAnimationOptionCurveLinear
                     animations:^{
                         controllerView.alpha = 1.0;
                     }
                     completion:nil
     ];

}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [picpicker dismissModalViewControllerAnimated:YES];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    [picpicker dismissModalViewControllerAnimated:YES];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    } else {
        return YES;
    }
}

@end

ここに画像の説明を入力

ここに画像の説明を入力

4

3 に答える 3

0

viewDidDisappearメソッドとviewWillDisappearメソッドの両方でコントローラーを閉じています。それが問題の原因である可能性があります。

于 2013-01-30T23:31:58.720 に答える
0

現在、これを確認できるカメラ付きのデバイスはありませんが、pickerview コントローラーを正しく閉じていないようです。ドキュメントには、ピッカーを閉じるために親コントローラーを呼び出す必要があると記載dismissModalViewControllerAnimated:ています(ただし、提示されたコントローラーへの呼び出しはプレゼンターに伝達されるため、これは問題ではありません)、あなたの場合、コントローラーをモーダルに表示していませんそもそもうまくいかない。

この場合に私が試みることはrelease、代わりに (ARC の下にない場合) ピッカーを使用し、nil(を呼び出す代わりに) に設定すること[picpicker dismissModalViewControllerAnimated:YES];です。

PS。実際、あなたのデザインにはもっと大きな問題があるようです。各ボタンは相手をモーダルに表示するように設定されているため、コントローラーを閉じることはありません。コントローラーは互いにスタックし続けます。それらをナビゲーションコントローラーに埋め込んで階層を処理させるか、モーダルセグエの代わりに2番目のコントローラーのボタンのアクションとしてdismissModalViewControllerAnimated:( iOS5 +で)設定することを検討する必要があります。dismissViewControllerAnimated:completion:

于 2013-02-01T09:02:23.747 に答える
0

これは非常に単純な問題です。なぜこれが起こるのか正確にはわかりませんが、UIImagePickerController は、それへの参照を保持するのではなく、必要になるたびに再作成されるように設計されているようです。基本的に、毎回ピッカーを再作成して再構成する必要があります。以下に、私が意味することのイメージを与えるためにいくつかのコードを貼り付けました。

簡単な解決策:

- (UIImagePickerController *)loadImagePicker {
    UIImagePickerController *picpicker = [[UIImagePickerController alloc] init];
    picpicker.delegate = self;
    picpicker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeImage, nil];
    picpicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    picpicker.cameraDevice = UIImagePickerControllerCameraDeviceFront;
    picpicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
    picpicker.showsCameraControls = NO;
    picpicker.navigationBarHidden = NO;
    picpicker.wantsFullScreenLayout = NO;
    return picpicker;
}

そして:

-(void)viewWillAppear:(BOOL)animated{
    if(!self.picpicker){
        self.picpicker = [self loadImagePicker];
        [self.view addSubview: self.picpicker];
    }
}

-(void)viewWillDisappear:(BOOL)animated {
     [super viewWillDisappear:animated];
     [self.picpicker removeFromSuperview];
     self.picpicker = nil;
}
于 2013-02-12T11:59:33.767 に答える