-1

私のアプリケーションは、縦向きモードのみをサポートするように info.plist に設定されています。

ただし、UIImagePickerController は、ユーザーが画面を横向きに回転すると回転します。

io6 では shouldAutoRotate メソッドが呼び出されていないため、次のように拡張しようとしました。

@interface NonRotatingUIImagePickerController : UIImagePickerController

@end

@implementation NonRotatingUIImagePickerController

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;

}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationMaskPortrait;
}

@end 

しかし、それは役に立ちません。理由はありますか?

ログには、上記のメソッドが呼び出されていることがわかります。UIImagePickerController は、最初は縦向きに表示され、ユーザーが回転すると縦向きのままではなく回転します。

ビューに画像ピッカーを次のように設定します。

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (!self.imagePickerController) {
        self.imagePickerController = [[NonRotatingUIImagePickerController alloc] init];
        self.imagePickerController.delegate = self;
    }
    return self;
}

- (void)viewDidAppear:(BOOL)animated{
   self.imagePickerController.showsCameraControls = NO;
   CGRect imagePickerControllerFrame = CGRectMake(0, topBar.frame.size.height, self.view.frame.size.width, self.view.frame.size.height - topBar.frame.size.height - bottomBar.frame.size.height);
   self.imagePickerController.view.frame = imagePickerControllerFrame;
   self.imagePickerController.allowsEditing = YES;
   self.imagePickerController.view.clipsToBounds = YES;
  self.imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera
  [self.view.window addSubview:self.imagePickerController.view];
}
4

2 に答える 2

2
self.imagePickerController.view.frame = imagePickerControllerFrame;
// ...
[self.view.window addSubview:self.imagePickerController.view];

まあ、それはすべて完全に違法です。Appleはドキュメントでこれを非常に明確にしています:

このクラスはそのまま使用することを意図しており、サブクラス化はサポートしていません。このクラスのビュー階層は非公開であり、変更してはなりません

UIImagePickerControllerSourceTypeCamera を使用するイメージ ピッカー コントローラーを使用する正しい方法は 1 つだけです - フルスクリーンで表示されるビュー コントローラーとして:

BOOL ok = [UIImagePickerController isSourceTypeAvailable:
           UIImagePickerControllerSourceTypeCamera];
if (!ok) {
    NSLog(@"no camera");
    return;
}
NSArray* arr = [UIImagePickerController availableMediaTypesForSourceType:
                UIImagePickerControllerSourceTypeCamera];
if ([arr indexOfObject:(NSString*)kUTTypeImage] == NSNotFound) {
    NSLog(@"no stills");
    return;
}
UIImagePickerController* picker = [UIImagePickerController new];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.mediaTypes = @[(NSString*)kUTTypeImage];
picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];

独自のインターフェイスにライブ写真撮影インターフェイスを表示する場合は、AVFoundation と、それが提供するカメラ キャプチャ API を使用します。

ここからダウンロード可能な作業例:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/ch30p816cameraCaptureWithAVFoundation/p683cameraCaptureWithAVFoundation/ViewController.m

于 2013-01-22T18:36:25.270 に答える
1

おそらく、この回答は役に立たないと考えるでしょう。ただし、Apple のドキュメントからスニペットを貼り付けます。

重要: UIImagePickerController クラスは縦向きモードのみをサポートします。このクラスはそのまま使用することを意図しており、サブクラス化はサポートしていません。このクラスのビュー階層はプライベートであり、1 つの例外を除いて変更してはなりません。カスタム ビューを cameraOverlayView プロパティに割り当て、そのビューを使用して追加情報を表示したり、カメラ インターフェイスとコード間の相互作用を管理したりできます。

UIImagePickerController ドキュメント リンク

キルジョイでごめんなさい。代替クラスを探す必要があります。クイック検索では、たくさんあることがわかります。

于 2013-01-22T19:27:43.700 に答える