横向きモードのアプリを作成していますが、iPhoneカメラを使用してUIImagePickerController
を使用して写真を撮影していますが、横向きモードでも作成したいです。
しかし、AppleのドキュメントはUIImagePickerController
が横向きをサポートしていないことを示唆しているので、必要な機能を得るにはどうすればよいですか?
...そして、私も横向きモードで作成したいです。
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表示中の回転の問題を修正しません。
これは、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でこれらをサポートするようにアプリが構成されていることを確認してください。そうしないと、ピッカーの起動時にクラッシュが発生する可能性があります。
ハックなしでランドスケープモードで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];
}
上記のコードメソッドを変更
- (NSUInteger)supportedInterfaceOrientations
{
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if(orientation == UIDeviceOrientationLandscapeRight || orientation == UIDeviceOrientationLandscapeLeft)
return UIInterfaceOrientationMaskLandscape;
else
return UIInterfaceOrientationMaskPortrait;
}
受け入れられた答えは私にはうまくいきません。また、モーダルプレゼンテーションスタイルを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のドキュメントによると、このピッカーをランドスケープモードで表示することはサポートされていないため、注意してください。