web-dev-qa-db-ja.com

iOS 7UIImagePickerプレビューの黒い画面

コードからカメラを読み込もうとすると、カメラのプレビューが黒くなります。 10〜20秒待つと、実際のカメラのプレビューが表示されます。私はいくつかの質問を見つけました、そしてそれらのいくつかはバックグラウンドで他のコードを実行することがこれの理由であるべきだと示唆しています。ただし、バックグラウンドで実行されているコードはありません。これをどのように修正すればよいですか?

これは私がカメラを実行する私のコードです

UIImagePickerController *photoPicker = [[UIImagePickerController alloc] init];

photoPicker.delegate = self;
photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:photoPicker animated:YES completion:NULL];
26
user2689024

約5か月前、私のチームはiOS7のUIImageViewControllerでメモリリークを発見しました。各インスタンス化により、アプリの速度が指数関数的に低下しました(つまり、最初のalloc-initには1秒の遅延があり、2番目には2秒の遅延があり、3番目には5秒の遅延がありました)。最終的に、30〜60の遅延が発生しました(あなたが経験しているのと同様)。

UIImagePickerControllerをサブクラス化し、シングルトンにすることで問題を解決しました。そうすれば、一度だけ初期化されました。これで遅延が最小限に抑えられ、リークが回避されます。サブクラス化がオプションでない場合は、viewControllerでクラスプロパティを試して、そのように遅延ロードしてください。

-(UIImagePickerController *)imagePicker{
    if(!_imagePicker){
        _imagePicker = [[UIImagePickerController alloc]init];
        _imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    }
    return _imagePicker;
}

その後、次のように呼び出すことができます。

[self presentViewController:self.imagePicker animated:YES completion:nil];
21
eckyzero

これは自分自身でしたか(メインのディスパッチスレッドで何かが実行されている場合に発生します)、万が一画像のサイズを変更していますか?

プレビューをメインスレッドに配置し、何かがそれを使用している場合は、黒い画面が表示されます。これはバグであり、回避策はメインスレッドを引き継ぐか、キューが空くまでフォトピッカーを無効にすることです。

2
davbryn