12

ここに画像の説明を入力iDevice のカメラから画像をキャプチャして Web サービスにアップロードするアプリを開発しています。

問題ありません。デバイスのカメラ以外はすべて正常に動作しています。デバイスのカメラが私の頭を悩ませています。以下のコードを使用して、ユーザーが画像をキャプチャできるようにしています。カメラでプレビューが表示される場合と表示されない場合があります。プレビューの代わりに、画面に完全な暗闇が表示されます。リアカメラからフロントカメラに切り替えると、正常に動作し始めます。デバイスからすべてのバックグラウンド アプリを削除し、できるだけ多くのメモリをクリアしようとさえしました。まだ運がなく、私は立ち往生しています。:(

- (IBAction)addNewImage:(id)sender
{
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        // Take picture from camera
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

        // set no to take as much pictures as user want.
        imagePicker.showsCameraControls = YES;

        // Show user the camera
        [self presentModalViewController:imagePicker
                                animated:YES];
    }
    else
    {
        imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        [self presentModalViewController:imagePicker
                                animated:YES];        
    }    
}
4

4 に答える 4

2

私は iOS7 で同じ問題に約 1 か月間直面していました。アプリ全体の長い長い頭を壊すコード レビューの後、問題を特定することができました。
IBOutletCollection(UILabel) NSArray *staticLabelsCollection;を列挙していました。配列 複数のスレッドで同時に実行されたラベル テキストを同時に更新します。

[self.labelsArr enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    UILabel * label = (UILabel*)obj;

    label.text=[NSString stringWithFormat:@"%d",idx+2];

}];

これにより、メイン スレッド以外で UIKit 要素を更新するという問題が発生しました。デバイス コンソールで警告を生成する Xcode で環境変数 CA_DEBUG_TRANSACTIONS=1 を有効にすることで、この問題をキャッチできました。

Nov 20 18:40:26 iPad2 CameraTest[1757] <Warning>: CoreAnimation: warning, deleted thread with uncommitted CATransaction; created by:
 0   QuartzCore                          0x32a553b3 <redacted> + 266
 1   QuartzCore                          0x32a55269 <redacted> + 224
 2   QuartzCore                          0x32a56871 <redacted> + 24
 3   QuartzCore                          0x32a56eed <redacted> + 40
 4   QuartzCore                          0x32a619ed <redacted> + 412
 5   QuartzCore                          0x32a6184b <redacted> + 46
 6   QuartzCore                          0x32a61819 <redacted> + 44
 7   UIKit                               0x32ddfe53 <redacted> + 86
 8   CameraTest                          0x000923b5 __35-[ViewController blockEnumeration:]_block_invoke + 184
 9   CoreFoundation                      0x305aa821 <redacted> + 92
 10  libdispatch.dylib                   0x3b3308eb <redacted> + 134
 11  libdispatch.dylib                   0x3b32fd71 <redacted> + 220
 12  libdispatch.dylib                   0x3b32ff59 <redacted> + 56
 13  libsystem_pthread.dylib             0x3b46adbf _pthread_wqthread + 298
 14  libsystem_pthread.dylib             0x3b46ac84 start_wqthread + 8

これらの「コミットされていない CATransactions」を強制的にメイン スレッドで実行することで修正すると、ブラック カメラの問題が修正されました。Option: NSEnumerationConcurrent を列挙から削除することで修正できました。

常に問題を再現できたサンプルアプリはこちらからダウンロードできます

サンプル アプリが問題の洞察と回避策を提供してくれることを願っています。

于 2013-11-21T07:32:50.930 に答える
0

アプリでこの問題に直面していました。問題が何であるかはわかりませんでしたが、UIIMagePickerControllerタイプのプロパティを定義し、ゲッターで一度初期化するようにコードを書き直しました。このプロパティを使用して、カメラ ビューを初期化しました。

ゲッター:

-(UIImagePickerController *) imagePicker{
    if(!_imagePicker){
       _imagePicker = [[UIImagePickerController alloc] init];
       _imagePicker.delegate = self;
       if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
           _imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
       }
       else{
           _imagePicker.sourceType =UIImagePickerControllerSourceTypePhotoLibrary;
       }  

   }
    return _imagePicker;
}


- (IBAction)addNewImage:(id)sender{
  if (self.imagePicker)
  {
      [self presentViewController:self.imagePicker animated:YES completion:^{}];
  }
}

何らかの理由で、これにより、プレビューで黒い画面が表示されることがあるという問題が解消されました

于 2013-05-26T06:13:29.763 に答える
-1

iOS7 では、mainWindow.rootViewController = a class has kind is UIViewController を設定する必要があります。それは私のための仕事です。rootViewController がそれ以外の場合 (例: UITabbarController、UINavigationController...)、カメラの黒い画面が表示されます。

于 2013-11-15T06:35:07.153 に答える