これは一般的な問題であり、iOS7の下でiPadアプリが横向きのみでUIImagePickerController
とソースUIImagePickerControllerSourceTypePhotoLibrary
またはUIImagePickerControllerSourceTypeCamera
。
それを正しく設定するにはどうすれば100%機能しますか?また、混合方向を取得せず、「サポートされている方向にはアプリケーションと共通の方向がないため、shouldAutorotate
はYES
を返します」というエラーを回避できます。
IPadアプリがすべての条件でのみ横向きの場合は、次の3つの手順を実行してください。
1)アプリのデリゲート内
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return UIInterfaceOrientationMaskAll;
}
2)カテゴリヘッダーを作成する
#import "UIViewController+OrientationFix.h"
@implementation UIViewController (OrientationFix)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
@end
)カテゴリー実装を作成します
#import "UIImagePickerController+OrientationFix.h"
@implementation UIImagePickerController (OrientationFix)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
@end
注:これらのカテゴリをどこかにインポートする必要はありません。プロジェクトでコンパイルされていれば十分です。
注:これらのメソッドをVCに実装する必要はありません
注:plistでサポートされている方向を変更する必要はありません
これはテストされ、任意の条件下で動作しています
Appleのサンプルコードからこのコードを見てきました。
UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
このため、IModalPresentationCurrentContextUIImagePickerController
は、デバイスの現在の方向に従って開かれます。
Appleのドキュメントによると:
「重要:UIImagePickerControllerクラスは縦向きモードのみをサポートします。」
ただし、フルスクリーンの横向きやiOS 6では問題なく機能します。
ほとんどの回答は.currentContext
の使用を推奨していますが、イメージピッカーを閉じた後、すべてが間違っていることがわかりました。
横長のiPadでは、imho.formSheet
を使用するのが最適です。
let picker = UIImagePickerController()
picker.modalPresentationStyle = .formSheet
picker.sourceType = .photoLibrary
picker.delegate = self
self.present(picker, animated: true)
上記のPeter Lapisuの提案に感謝します。私には機能しません(おそらくiOS 8.3を使用しています)が、方向の問題を修正するように変更することができました。私のコードは以下です
アプリの委任中
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskAll;
}
UIImagePickerControllerカテゴリ
@implement UIImagePickerController (extensions)
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [[UIApplication sharedApplication] statusBarOrientation];
}
@end
UIViewControllerカテゴリ
@implementation UIViewController (extensions)
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
@end
Swift 4
解決
NavigationViewControllerにViewControllerが埋め込まれている場合は、そこに修正を加えるようにしてください。この制限をViewControllerに追加しても機能しません...
import UIKit
class MainNavigationViewController: UINavigationController {
override var shouldAutorotate: Bool {
return true
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .landscape
}
}
そしてもちろん、AppDelegateの上記のコード:
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return .all
}
ところで、これはiOS 10以下でのみ必要です。 AppleはiOS 11以降で修正されているようです...