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

IpadUipopovercontrollerLandscapeIos6

Ipad Problem Overview


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.

Ipad Solutions


Solution 1 - Ipad

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

Solution 2 - Ipad

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!

Solution 3 - Ipad

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

Solution 4 - Ipad

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.

Solution 5 - Ipad

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!

Solution 6 - Ipad

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];

Solution 7 - Ipad

- (BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

This removes the crash.

Solution 8 - Ipad

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.

Solution 9 - Ipad

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.

Solution 10 - Ipad

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

Solution 11 - Ipad

Swift 3

let imagePicker = UIImagePickerController()

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

present(imagePicker, animated: true)

Solution 12 - Ipad

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
}

Solution 13 - Ipad

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
}

Solution 14 - Ipad

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDestiny DawnView Question on Stackoverflow
Solution 1 - IpadSnickersView Answer on Stackoverflow
Solution 2 - IpadDr.LuijiView Answer on Stackoverflow
Solution 3 - IpadJackPearseView Answer on Stackoverflow
Solution 4 - IpadTrausti KristjanssonView Answer on Stackoverflow
Solution 5 - IpadRobbyView Answer on Stackoverflow
Solution 6 - IpadpoetowenView Answer on Stackoverflow
Solution 7 - IpadSuhail BhatView Answer on Stackoverflow
Solution 8 - IpadderbsView Answer on Stackoverflow
Solution 9 - IpadEquiAvia TechView Answer on Stackoverflow
Solution 10 - IpadHelge StaedtlerView Answer on Stackoverflow
Solution 11 - IpadzombieView Answer on Stackoverflow
Solution 12 - IpadGal BlankView Answer on Stackoverflow
Solution 13 - IpadItachiView Answer on Stackoverflow
Solution 14 - IpadatereshkovView Answer on Stackoverflow