web-dev-qa-db-ja.com

UIImagePickerControllerを横向きで使用する

横向きモードのアプリを作成していますが、iPhoneカメラを使用してUIImagePickerControllerを使用して写真を撮影していますが、横向きモードでも作成したいです。

しかし、AppleのドキュメントはUIImagePickerControllerが横向きをサポートしていないことを示唆しているので、必要な機能を得るにはどうすればよいですか?

29
Paras Gorasiya

...そして、私も横向きモードで作成したいです。

1行のコードで大きな違いが得られます! IBActionがランディングするメソッドまたは関数内:

Swiftでは、

let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
// .overCurrentContext allows for landscape and portrait mode
imagePickerController.modalPresentationStyle = .overCurrentContext

Objective-C、

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
[imagePickerController setDelegate:self];
[imagePickerController setModalPresentationStyle: UIModalPresentationOverCurrentContext];

注:これにより、imagePickerControllerはビューを正しく表示できますが、 意志 may表示中の回転の問題を修正しません。

30
David

これは、iOS 10/11のSwift 4.でうまく機能します。

import UIKit

extension UIImagePickerController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .all
    }
}

拡張機能をプロジェクトのどこかにドロップするだけで、機能するためにサブクラス化する必要はありません。

デバイスタイプを指定する必要がある場合は、次のようなチェックを追加できます。

import UIKit

extension UIImagePickerController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIDevice.current.userInterfaceIdiom == .phone ? .portrait : .all
    }
}

これにより、iPadが自由に回転できるようになりますが、電話機ではポートレートモードが強制されます。 info.plistでこれらをサポートするようにアプリが構成されていることを確認してください。そうしないと、ピッカーの起動時にクラッシュが発生する可能性があります。

8
CodeBender

ハックなしでランドスケープモードでUIImagePickerControllerを使用する正しい方法は、UIPopoverControllerに入れることです。

- (void)showPicker:(id)sender
{
    UIButton *button = (UIButton *)sender;
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    _popover = [[UIPopoverController alloc] initWithContentViewController:picker];
    [_popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
5
iain

上記のコードメソッドを変更

- (NSUInteger)supportedInterfaceOrientations
 {
     UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
     if(orientation == UIDeviceOrientationLandscapeRight || orientation == UIDeviceOrientationLandscapeLeft)
         return UIInterfaceOrientationMaskLandscape;
     else
         return UIInterfaceOrientationMaskPortrait;
 }
3

受け入れられた答えは私にはうまくいきません。また、モーダルプレゼンテーションスタイルをUIImagePickerControllerに追加して機能させる必要がありました。

UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
pickerController.modalPresentationStyle = UIModalPresentationCurrentContext; //this will allow the picker to be presented in landscape
pickerController.delegate = self;
pickerController.allowsEditing = YES;
pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:pickerController animated:YES completion:nil];

そしてもちろん、ピッカーを表示するコントローラーにこれを置くことを忘れないでください:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape; //this will force landscape
}

ただし、Appleのドキュメントによると、このピッカーをランドスケープモードで表示することはサポートされていないため、注意してください。

2
Michal Cichon