Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES'
Asked Answered
C

15

96

My app (iPad;iOS 6) is a landscape only application, but when I try using a UIPopoverController to display the photo library it throws this error: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES. I've tried changing a lot of the code around but I've had no luck.

Curiel answered 22/9, 2012 at 4:6 Comment(4)
you should accept an answer. there are much people for help and for other people who have the same issue it helps out when you mark the correct answer for your issue!Noelyn
No! no solution work on iOS 7 :( (headbang)Telegraphese
Best answer here #20468835Eclampsia
I have started to get this issue after iOS 17 upgrade. I am using Ionic Hybrid framework v3. Cordova plugin github.com/katzer/cordova-plugin-printer is being used. i have raised an issue on github, but there seems to be no update : github.com/katzer/cordova-plugin-printer/issues/302 Let me know if there are any leadsBoardwalk
F
98

In IOS6 you have supported interface orientations in three places:

  1. The .plist (or Target Summary Screen)
  2. Your UIApplicationDelegate
  3. The UIViewController that is being displayed

If you are getting this error it is most likely because the view you are loading in your UIPopover only supports portrait mode. This can be caused by Game Center, iAd, or your own view.

If it is your own view, you can fix it by overriding supportedInterfaceOrientations on your UIViewController:

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

If it is not your own view (such as GameCenter on the iPhone), you need to make sure your .plist supports portrait mode. You also need to make sure your UIApplicationDelegate supports views that are displayed in portrait mode. You can do this by editing your .plist and then overriding the supportedInterfaceOrientation on your UIApplicationDelegate:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
Fruity answered 24/9, 2012 at 23:29 Comment(6)
UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight equals UIInterfaceOrientationMaskAllButUpsideDown UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight equals UIInterfaceOrientationMaskLandscapeGurango
Or just use UIInterfaceOrientationMaskAll.Monogenetic
Perfect. Even though a "portrait-only" popover will work in landscape, it can't present a landscape-only view controller modally.Antwanantwerp
No! Solution did not worked on iOS 7 :(. #23005851Telegraphese
Worked on iOS 8. Though, had to add portrait support to plist. Thank you.Spatial
My issue was with StoreKit on a landscape app. Adding portrait as a supported interface orientation in the AppDelegate file was the fix!Treadway
H
66

After spending a lot of time searching a way to avoid subclassing and adding ton of code, here's my one line code solution.

Create a new one UIImagePickerController's category and add

-(BOOL)shouldAutorotate{
    return NO;
}

That's all folks!

Hairworm answered 11/10, 2012 at 7:28 Comment(9)
Worked for me as well, haven't fully tested but seems to do the trick so far.Photoengraving
This seems to be the best solution.Alper
Works! This is great, and it really helped me out in a pinch. Thanks Dr Luiji!!Mulhouse
Nice. Works for me on iOS 6. You could also make this configurable in the category for full flexibility.Arcograph
Works and also rotates when you have 2 landscape rotations supported in iPad.Muss
doesn't work in iOS7, the category method is not even called (although included in the pch)Slambang
No! solution did not work on iOS 7! :( #23005851Telegraphese
Worked like a charm for my work too! But I guess we all should study and learn a little bit deeper than just putting this code! :-) Cheers!Pomcroy
This was working for me (as a subclass not a category) until iOS 8.3, now it crashes again.Kalgan
C
44

There is another case this error message may appear. I was searching for hours until I found the problem. This thread was very helpful after reading it a couple of times.

If your main view controller is rotated to landscape orientation and you invoke a custom sub view controller which should be displayed in portrait orientation this error message can happen when your code looks like this:

- (NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationPortrait;
}

The trap here was xcode's intellisense suggested "UIInterfaceOrientationPortrait" and I didn't care about it. At the first glance this seemed to be correct.

The right mask is named

UIInterfaceOrientationMaskPortrait

Be aware of the small infix "Mask", else your subview will end up with an exception and the mentioned error message above.

The new enums are bit shifted. The old enums return invalid values!

(in UIApplication.h you can see the new declaration: UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait) )

The solution is:

- (BOOL)shouldAutorotate {

    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {

    // ATTENTION! Only return orientation MASK values
    // return UIInterfaceOrientationPortrait;

    return UIInterfaceOrientationMaskPortrait;
} 

In swift use

override func shouldAutorotate() -> Bool {

    return true
}

override func supportedInterfaceOrientations() -> Int {

    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
Colvert answered 1/2, 2013 at 10:25 Comment(5)
happened to me for the same reasonRanda
I wish apple would just have made the return type UIInterfaceOrientationMask so that is a little more obvious what needs to be returned.Reina
Jackpearse 's answer looks correct. But when look into the info.plist, there 's UISupportedInterfaceOrientations with UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight. No MASK hereBuchmanism
@onmyway: That's true, the plist values didn't change. In the iOS version before, Apple used the "non" mask values inside the code. This is some legacy stuff. I assume that apple is bit shifting the plist values internally now.Colvert
My app used to work without this crashing problem on an iPad simulator of Xcode 6.2. And it crashed after I upgraded to Xcode 6.3 a few days ago. Now this solution fixes my problem. Thx a lot :-)Buchenwald
R
22

I had a similar issue when presenting the image picker in a landscape only app. As suggested by Dr. Luiji's, I added the following category at the beginning of my controller.

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

It's easiest to add these lines just before the @implementation of your ViewController .m file.

Rory answered 12/11, 2012 at 17:30 Comment(3)
I have a portrait only app! and I want to show Camera in Landscape mode. any solution?????Telegraphese
Trausti not worked ? i have same issue and i tried your code but still appear same exception *** Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES........ i also put a breakpoint on UIimagePickerView category method shouldAutorotate reaching there and returns no but still give this exception .... My app is Landscape only app... please help meVenable
Also works to force SKStoreProductViewController to present in portrait when the whole app is landscape in iOS 8. Thanking you.Spatial
C
11

I was encountering the same error message in my code. I found this, it's a bug as reported by Apple:

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

His solution is to fix it in the AppDelegate. I implemented it and it works for me!

Cuyler answered 22/1, 2013 at 23:37 Comment(3)
By the way, I originally found this at: #12522991Cuyler
This was the right answer, direct from Apple, and then I just had to follow the same instructions but do it in Swift for an app targeting iOS 8. Everything works great. AppDelegate sets supportedInterfaceOrientationsForWindow to both Landscape and Portrait, each individual swift file sets override func supportedInterfaceOrientations to Landscape only so the view won't rotate, but when a portrait view (in my case SKStoreProductViewController) needs to load, it works!Treadway
Jeez, there are so many suggested solutions, and this one by far does not have the highest points, but it is indeed the correct one. Tested on iOS 10 and 9. Nothing else works.Hairstreak
F
6

I had the same problem and this answer https://stackoverflow.com/a/12523916 works for me. Wonder if there is a more elegant solution.

My code:

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];
Froward answered 22/9, 2012 at 18:2 Comment(2)
I tried doing that but when I click the button to call the code but nothing displayed, also I tried adding @interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController - (BOOL)shouldAutorotate { return NO; } @end to the code but my code wouldn't detect NonRotatingUIImagePickerController.Curiel
Never mind, It detects NonRotatingUIImagePickerController now but nothing displays still... @FrowardCuriel
D
4
- (BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

This removes the crash.
Dhruv answered 16/1, 2014 at 5:27 Comment(0)
M
4

iOS 8 - you can use UIModalPresentationPopover without any hacks to display in a popover. Not ideal but better than nothing.

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

Edit: perhaps try the different UIModalPresentationStyles - maybe more will work in landscape.

Meridith answered 28/1, 2015 at 17:5 Comment(0)
M
2

Another option that resolved my issues was to create a subclass of the UIImagePickerController and to override the below method

@interface MyImagePickerController ()

@end

@implementation MyImagePickerController

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

Use this instead of the UIImagePickerController and it all works fine.

Mean answered 30/12, 2012 at 1:41 Comment(0)
D
2

Swift 4 and up assuming the whole app is in landscape and you need to present a single controller in portrait. In the view controller that has to be portrait add the following :

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

open override var shouldAutorotate: Bool {
    return false
}
Donatus answered 5/1, 2019 at 20:50 Comment(1)
I was having this problem only when running my app in a non debug build. This answer solved the issue for me.Temperate
W
1

Creating a category is really helpful to fix this bug. And do not forget to import your created category. This will add the missing method to UIImagePickerController and on iOS 6 it will restrict it to work in Portrait only as the documentation states btw.

The other solutions may have worked. But with SDK for iOS 8.x compiled to deploy on iOS 6.1 this seems the way to go.

The .h-file:

#import <UIKit/UIKit.h>

@interface UIImagePickerController (iOS6FIX)

- (BOOL) shouldAutorotate;
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation;

@end

The .m-file:

#import "UIImagePickerController+iOS6FIX.h"

@implementation UIImagePickerController (iOS6FIX)

- (BOOL) shouldAutorotate {
    return NO;
}

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

@end
Washroom answered 9/3, 2015 at 3:31 Comment(0)
S
1

Swift 3

let imagePicker = UIImagePickerController()

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

present(imagePicker, animated: true)
Spirillum answered 2/2, 2017 at 14:34 Comment(0)
F
0

I encountered this crash issue when converting UIInterfaceOrientationPortrait to UIInterfaceOrientationMaskPortrait implicitly as a return value.

More code background on UIPageViewControllerDelegate, just FYI for all of you.

 -(UIInterfaceOrientationMask)pageViewControllerSupportedInterfaceOrientations:
(UIPageViewController *)pageViewController
{
    # return UIInterfaceOrientationPortrait;    # wrong
    return UIInterfaceOrientationMaskPortrait;  # correct
}
Foreground answered 14/3, 2018 at 2:6 Comment(0)
C
0

I've just resolved the issue for 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
    }
}

Thank you guys for your answers also. I've just cut the worked code and simply refactored it.

Cassino answered 7/12, 2018 at 10:17 Comment(0)
G
0

Swift 5.3 iOS 16

First step Add this method and variable in app delegate

 var restrictRotation:UIInterfaceOrientationMask = .portrait

 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return self.restrictRotation
}

Second Step In your desired view controller where you want to rotate device orientation just simply change that var in app delegate like this

 override func viewDidLoad() {
    super.viewDidLoad()
    (UIApplication.shared.delegate as! AppDelegate).restrictRotation = .landscapeLeft
}

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .landscape
} 

override var shouldAutorotate: Bool {
    return true
}

Before going back to particular controller just change that var again

 (UIApplication.shared.delegate as! AppDelegate).restrictRotation = .portrait
 self.dismiss(animated: true) // for dismissing the controller
Gladine answered 22/5, 2023 at 17:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.