私のアプリ(iPad; iOS 6)はランドスケープのみのアプリケーションですが、UIPopoverControllerを使用して写真ライブラリを表示しようとすると、次のエラーがスローされます
Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES.
。
私のアプリ(iPad; iOS 6)はランドスケープのみのアプリケーションですが、UIPopoverControllerを使用して写真ライブラリを表示しようとすると、次のエラーがスローされます
Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES.
。
回答:
IOS6では、3つの場所でインターフェースの向きをサポートしています。
このエラーが発生する場合は、UIPopoverにロードしているビューが縦向きモードのみをサポートしていることが原因である可能性が高いです。これは、Game Center、iAd、または独自のビューによって発生する可能性があります。
独自のビューの場合は、UIViewControllerのsupportedInterfaceOrientationsをオーバーライドすることで修正できます。
- (NSUInteger) supportedInterfaceOrientations
{
//Because your app is only landscape, your view controller for the view in your
// popover needs to support only landscape
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
自分のビューでない場合(iPhoneのGameCenterなど)、. plistがポートレートモードをサポートしていることを確認する必要があります。また、UIApplicationDelegateがポートレートモードで表示されるビューをサポートしていることを確認する必要があります。これを行うには、.plistを編集してから、UIApplicationDelegateでsupportedInterfaceOrientationをオーバーライドします。
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight
等しい= UIInterfaceOrientationMaskAllButUpsideDown
UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight
等しいUIInterfaceOrientationMaskLandscape
多くの時間を費やして、サブクラス化を避け、大量のコードを追加する方法を探した後、これが私の1行のコードソリューションです。
新しいUIImagePickerControllerのカテゴリを作成して追加します
-(BOOL)shouldAutorotate{
return NO;
}
それはすべての人々です!
このエラーメッセージが表示される場合もあります。問題が見つかるまで何時間も探していました。このスレッドは、数回読んだ後、非常に役に立ちました。
メインビューコントローラーが横向きに回転しているときに、縦向きで表示する必要があるカスタムサブビューコントローラーを呼び出すと、コードが次のようになると、このエラーメッセージが表示されます。
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationPortrait;
}
ここでのトラップは、xcodeのインテリセンスが「UIInterfaceOrientationPortrait」を提案したことであり、私はそれを気にしませんでした。一見するとこれは正しいように見えました。
正しいマスクの名前は
UIInterfaceOrientationMaskPortrait
小さな内接"マスク"に注意してください。そうしないと、サブビューは例外と上記のエラーメッセージで終了します。
新しい列挙型はビットシフトされています。古い列挙型は無効な値を返します!
(UIApplication.hで新しい宣言を確認できます:UIInterfaceOrientationMaskPortrait =(1 << UIInterfaceOrientationPortrait))
解決策は次のとおりです。
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
// ATTENTION! Only return orientation MASK values
// return UIInterfaceOrientationPortrait;
return UIInterfaceOrientationMaskPortrait;
}
迅速に使用
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
横向きのみのアプリで画像ピッカーを表示するときにも同様の問題がありました。ルイージ博士の提案に従い、コントローラーの最初に次のカテゴリを追加しました。
// This category (i.e. class extension) is a workaround to get the
// Image PickerController to appear in landscape mode.
@interface UIImagePickerController(Nonrotating)
- (BOOL)shouldAutorotate;
@end
@implementation UIImagePickerController(Nonrotating)
- (BOOL)shouldAutorotate {
return NO;
}
@end
ViewController .mファイルの@implementationの直前にこれらの行を追加するのが最も簡単です。
コードで同じエラーメッセージが表示されました。私はこれを見つけました、それはAppleによって報告されたバグです:
https://devforums.apple.com/message/731764#731764
彼の解決策は、AppDelegateで修正することです。私はそれを実装し、それは私のために動作します!
私は同じ問題を抱えていましたが、この答えは私にとってはhttps://stackoverflow.com/a/12523916でうまくいきます。よりエレガントな解決策があるかどうか疑問に思います。
私のコード:
UIImagePickerController *imagePickerController = [[NonRotatingUIImagePickerController alloc] init];
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
UIPopoverController *popoverVC = [[UIPopoverController alloc] initWithContentViewController:imagePickerController];
[popoverVC presentPopoverFromRect:frame // did you forget to call this method?
inView:view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
@interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController - (BOOL)shouldAutorotate { return NO; } @end
ず、コードに追加しようとしましたが、コードがNonRotatingUIImagePickerControllerを検出しませんでした。
iOS 8-ハックなしでUIModalPresentationPopoverを使用して、ポップオーバーに表示できます。理想的ではないが、何もないよりはましだ。
imagePicker.modalPresentationStyle = UIModalPresentationPopover;
imagePicker.popoverPresentationController.sourceView = self.view;
imagePicker.popoverPresentationController.sourceRect = ((UIButton *)sender).frame;
編集:おそらく別のUIModalPresentationStylesを試してください。
私の問題を解決した別のオプションは、UIImagePickerControllerのサブクラスを作成し、以下のメソッドをオーバーライドすることでした
@interface MyImagePickerController ()
@end
@implementation MyImagePickerController
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
UIImagePickerControllerの代わりにこれを使用すると、すべて正常に動作します。
カテゴリを作成すると、このバグを修正するのに非常に役立ちます。作成したカテゴリをインポートすることを忘れないでください。これにより、不足しているメソッドがUIImagePickerControllerに追加され、iOS 6では、ドキュメントに記載されているように、ポートレートでのみ機能するように制限されます。
他のソリューションが機能している可能性があります。しかし、iOS 6.1にデプロイするためにコンパイルされたiOS 8.xのSDKでは、これが適切な方法です。
.hファイル:
#import <UIKit/UIKit.h>
@interface UIImagePickerController (iOS6FIX)
- (BOOL) shouldAutorotate;
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation;
@end
.mファイル:
#import "UIImagePickerController+iOS6FIX.h"
@implementation UIImagePickerController (iOS6FIX)
- (BOOL) shouldAutorotate {
return NO;
}
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationPortrait;
}
@end
暗黙的に戻り値に変換するUIInterfaceOrientationPortrait
UIInterfaceOrientationMaskPortrait
と、このクラッシュの問題が発生しました。
より多くのコードの背景UIPageViewControllerDelegate
、皆さんのために。
-(UIInterfaceOrientationMask)pageViewControllerSupportedInterfaceOrientations:
(UIPageViewController *)pageViewController
{
# return UIInterfaceOrientationPortrait; # wrong
return UIInterfaceOrientationMaskPortrait; # correct
}
Swift 4.xの問題を解決しました
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
configureVideoOrientation()
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: nil, completion: { [weak self] _ in
self?.configureVideoOrientation()
})
}
private func configureVideoOrientation() {
guard let previewLayer = self.previewLayer, let connection = previewLayer.connection else { return }
if connection.isVideoOrientationSupported {
let orientation = UIApplication.shared.statusBarOrientation
switch (orientation) {
case .portrait:
previewLayer.connection?.videoOrientation = .portrait
case .landscapeRight:
previewLayer.connection?.videoOrientation = .landscapeRight
case .landscapeLeft:
previewLayer.connection?.videoOrientation = .landscapeLeft
case .portraitUpsideDown:
previewLayer.connection?.videoOrientation = .portraitUpsideDown
default:
previewLayer.connection?.videoOrientation = .portrait
}
previewLayer.frame = self.view.bounds
}
}
皆さんの回答もありがとうございました。作業したコードをカットしてリファクタリングしただけです。