サポートされている方向はアプリケーションと共通の方向ではなく、shouldAutorotateはYESを返します '


92

私のアプリ(iPad; iOS 6)はランドスケープのみのアプリケーションですが、UIPopoverControllerを使用して写真ライブラリを表示しようとすると、次のエラーがスローされます Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES.


1
答えを受け入れる必要があります。多くの人が助けを求めており、同じ問題を抱えている他の人にとっても、問題の正しい答えをマークすると助けになります!
Brush51

1
番号!iOS 7ではソリューションが機能しません:((
headbang

回答:


94

IOS6では、3つの場所でインターフェースの向きをサポートしています。

  1. .plist(またはターゲットの概要画面)
  2. あなたのUIApplicationDelegate
  3. 表示されているUIViewController

このエラーが発生する場合は、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;
}

3
UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight等しい= UIInterfaceOrientationMaskAllButUpsideDown UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight等しいUIInterfaceOrientationMaskLandscape
バレリーパブロフ

4
または、UIInterfaceOrientationMaskAllを使用します。
Mark Wang

完璧です。「縦向きのみ」のポップオーバーは横向きでも機能しますが、横向きのみのビューコントローラーをモーダルで表示することはできません。
Neal Ehardt 2013

番号!ソリューションは、iOS 7 :(上で働いていなかった。 stackoverflow.com/questions/23005351/...
AsifHabib

iOS 8で動作しましたが、plistに縦向きのサポートを追加する必要がありました。ありがとうございました。
Yaroslav

65

多くの時間を費やして、サブクラス化を避け、大量のコードを追加する方法を探した後、これが私の1行のコードソリューションです。

新しいUIImagePickerControllerのカテゴリを作成して追加します

-(BOOL)shouldAutorotate{
    return NO;
}

それはすべての人々です!


1
私のためにも働いた、完全にテストされていないが、今のところトリックを行うようです。
migs647 2012年

2
これが最善の解決策のようです。
ジュリアン、

2
動作します!これはすばらしいことであり、私はピンチに本当に役立ちました。ルイジ博士に感謝します!!
Brackの

1
いいね。私はiOS 6で動作します。これをカテゴリで構成可能にして、完全な柔軟性を実現することもできます。
Jared Egan 2013

3
iOS7では機能しません。カテゴリーメソッドは呼び出されません(pchに含まれています)
Peter Lapisu

43

このエラーメッセージが表示される場合もあります。問題が見つかるまで何時間も探していました。このスレッドは、数回読んだ後、非常に役に立ちました。

メインビューコントローラーが横向きに回転しているときに、縦向きで表示する必要があるカスタムサブビューコントローラーを呼び出すと、コードが次のようになると、このエラーメッセージが表示されます。

- (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)
}

5
同じ理由で私に起こった
ChenXin 2013年

Appleが戻り値の型をUIInterfaceOrientationMaskにしただけで、戻り値が何であるかがより明確になることを願っています。
LightningStryk

Jackpearseの答えは正しいようです。しかし、info.plistを見ると、UIInterfaceOrientationPortrait、UIInterfaceOrientationLandscapeLeft、UIInterfaceOrientationLandscapeRightを持つUISupportedInterfaceOrientationsがあります。ここにマスクはありません
onmyway133 '27 / 06/27

1
@onmyway:そうです、plistの値は変わりませんでした。以前のiOSバージョンでは、Appleはコード内で「非」マスク値を使用していました。これはレガシーのものです。私は今、Appleがplist値をビットシフトしていると思います。
JackPearse

私のアプリは、Xcode 6.2のiPadシミュレーターでこのクラッシュの問題なしに機能していました。数日前にXcode 6.3にアップグレードした後、クラッシュしました。今、この解決策は私の問題を修正します。Thxたくさん:-)
Golden Thumb

22

横向きのみのアプリで画像ピッカーを表示するときにも同様の問題がありました。ルイージ博士の提案に従い、コントローラーの最初に次のカテゴリを追加しました。

// 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の直前にこれらの行を追加するのが最も簡単です。


ポートレートのみのアプリがあります!カメラを横長モードで表示したい。任意のソリューション?????
AsifHabib 2014

トラウスティは機能しませんでしたか?私は同じ問題を抱えていますが、コードを試しましたが、同じ例外が表示されます***キャッチされない例外「UIApplicationInvalidInterfaceOrientation」によるアプリの終了、理由:「サポートされている方向は、アプリケーションと共通の方向を持たず、shouldAutorotateがYESを返します... ...私も何が到達UIimagePickerViewカテゴリメソッドshouldAutorotateにブレークポイントとリターンを置くが、それでも、この例外を与える....私のアプリは風景だけのアプリではありません...私を助けてください
Vishal16

また、iOS 8でアプリ全体が横向きの場合、SKStoreProductViewControllerを強制的に縦向きに表示するように機能します。ありがとうございます。
Yaroslav

11

コードで同じエラーメッセージが表示されました。私はこれを見つけました、それはAppleによって報告されたバグです:

https://devforums.apple.com/message/731764#731764

彼の解決策は、AppDelegateで修正することです。私はそれを実装し、それは私のために動作します!


:ところで、私はもともとでこれを見つけたstackoverflow.com/questions/12522491/...
ロビー

これは正解であり、Appleから直接送信されたので、同じ手順に従う必要がありましたが、iOS 8をターゲットとするアプリの場合はSwiftで実行しました。AppDelegateはsupportedInterfaceOrientationsForWindowをLandscapeとPortraitの両方に設定し、個々のSwiftファイルセットはfunc supportedInterfaceOrientationsをLandscapeのみにオーバーライドするため、ビューは回転しませんが、ポートレートビュー(私の場合はSKStoreProductViewController)をロードする必要がある場合、それは機能します!
RanLearns 2015年

Jeez、提案された解決策は非常に多くあり、これは断然最高点ではありませんが、それは実際に正しい解決策です。iOS 10および9でテストされています。それ以外は機能しません。
デミアンターナー

6

私は同じ問題を抱えていましたが、この答えは私にとっては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を検出しませんでした。
Destiny Dawn

1
気にしないでください。NonRotatingUIImagePickerControllerを検出しますが、何も表示されません... @poetowen
Destiny Dawn

4

iOS 8-ハックなしでUIModalPresentationPopoverを使用して、ポップオーバーに表示できます。理想的ではないが、何もないよりはましだ。

imagePicker.modalPresentationStyle = UIModalPresentationPopover;
imagePicker.popoverPresentationController.sourceView = self.view;
imagePicker.popoverPresentationController.sourceRect = ((UIButton *)sender).frame;

編集:おそらく別のUIModalPresentationStylesを試してください。


3
- (BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

This removes the crash.

2

私の問題を解決した別のオプションは、UIImagePickerControllerのサブクラスを作成し、以下のメソッドをオーバーライドすることでした

@interface MyImagePickerController ()

@end

@implementation MyImagePickerController

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

UIImagePickerControllerの代わりにこれを使用すると、すべて正常に動作します。


1

カテゴリを作成すると、このバグを修正するのに非常に役立ちます。作成したカテゴリをインポートすることを忘れないでください。これにより、不足しているメソッドが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

1

スウィフト3

let imagePicker = UIImagePickerController()

imagePicker.modalPresentationStyle = .popover
imagePicker.popoverPresentationController?.sourceView = sender // you can also pass any view 

present(imagePicker, animated: true)

0

暗黙的に戻り値に変換するUIInterfaceOrientationPortraitUIInterfaceOrientationMaskPortraitと、このクラッシュの問題が発生ました

より多くのコードの背景UIPageViewControllerDelegate、皆さんのために。

 -(UIInterfaceOrientationMask)pageViewControllerSupportedInterfaceOrientations:
(UIPageViewController *)pageViewController
{
    # return UIInterfaceOrientationPortrait;    # wrong
    return UIInterfaceOrientationMaskPortrait;  # correct
}

0

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
    }
}

皆さんの回答もありがとうございました。作業したコードをカットしてリファクタリングしただけです。


0

アプリ全体が横向きであり、1つのコントローラーを縦向きで提示する必要があると想定して、Swift 4以降。縦向きでなければならないビューコントローラーで、以下を追加します。

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

open override var shouldAutorotate: Bool {
    return false
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.